Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获得;未定义索引“;在使用str_getcsv()创建的数组上;但var_dump()显示密钥存在_Php_Arrays_Undefined Index - Fatal编程技术网

Php 获得;未定义索引“;在使用str_getcsv()创建的数组上;但var_dump()显示密钥存在

Php 获得;未定义索引“;在使用str_getcsv()创建的数组上;但var_dump()显示密钥存在,php,arrays,undefined-index,Php,Arrays,Undefined Index,我使用str\u getcsv()创建了一个数组: 返回的$array从var\u dump($array)输出该值 当我尝试访问$array['fund']时,我得到注意:未定义的索引:fund。我的第一个想法是,fund在CSV标题的键名中有一个隐藏字符,因为$array['name']可以工作,但我已经检查过,唯一隐藏的字符是CRLF 我在多维数组的StackOverflow上看到过类似的问题,但在一维数组中没有 任何帮助都将不胜感激。我甚至尝试过对StdClass和$array->fun

我使用
str\u getcsv()
创建了一个数组:

返回的
$array
var\u dump($array)
输出该值

当我尝试访问
$array['fund']时,我得到
注意:未定义的索引:fund
。我的第一个想法是,
fund
在CSV标题的键名中有一个隐藏字符,因为
$array['name']
可以工作,但我已经检查过,唯一隐藏的字符是
CR
LF

我在多维数组的StackOverflow上看到过类似的问题,但在一维数组中没有

任何帮助都将不胜感激。我甚至尝试过对StdClass和
$array->fund
进行强制转换,得到了一个关于不存在属性的类似错误

我尝试将第一个标题列名重命名为任意名称,但它仍然存在问题,因此我想知道访问第一个键是否有问题。

tldr; 您正在尝试访问
$array['fund']
,而您应该访问
$array[0]['fund']
。您将其视为一个一维数组,但它是一个多维数组(维度1,索引;维度2,关联)


说明: 您没有在尝试访问
$array['fund']
的位置显示特定代码,也没有显示您的特定输入,但问题似乎是您误解了用于解析CSV的代码的结果数组的结构

array\u map()
+
array\u walk()
+
array\u combine()
+
array\u shift()
获取所需内容似乎有点让人困惑,结果正在显示。这是一个明显的例子,说明“聪明”的代码正在提高生产率。与其他方法相比,双线性数组结构更难解析

我将假设此输入,因为您不提供任何输入,并且读取外部文件超出了此问题的范围(本身并不是问题):

//输入

$lines=Do:
$new=[];foreach($k=>$v的数组){$new[trim($k)]=$v;}
之前,检查它是否与新数组一起工作。它应该删除任何不可见的空白(包括CR LF),我试过了,但没有成功。但是,我只是在Excel中打开了CSV文件,并使用
逗号分隔值(.CSV)
选项重新保存,而不是使用
文件>另存为
菜单中的
CSV UTF-8(逗号分隔)(.CSV)
选项,结果成功了。我将尝试为遇到此问题的任何其他人更新答案。您的文件中可能有BOM表-了解您需要添加实际使用的代码和有问题的输入文件,至少是这一行。否则我们就只能猜测了。如果你建议的话,为什么
var\u dump($array)
不显示多维数组(而是一个assoc数组)。Stefan,我看不到生成数组后使用的代码,也看不到正在使用的输入。但是,如果你转到我链接的示例,你会清楚地看到,这个特定循环的结果是一个包含N个关联数组的索引数组。@Stefan我所做的唯一更改是从多行字符串而不是多行文件中读取。你必须同意没有实际的区别。结果显然是一个N维数组(这是有意义的,因为这将允许您处理包含2条以上记录的CSV;我收集的是目标)。更明显的是,在您自己代码的循环中,您正在访问
$array[0]
。所以在您自己的代码中,您知道
$array
是索引的,而不是关联的。@StefanDunn现在知道了吗?我进一步编辑了我的答案,使之更加清晰。
$array = array_map('str_getcsv', file($file['tmp_name']));
array_walk($array, function(&$a) use ($array) {
    $a = array_combine($array[0], $a);
});
array_shift($array);
array(18) {
  ["fund"]=>
  string(6) "Fund 1"
  ["name"]=>
  string(13) "Property Name"
  ["investment"]=>
  string(13) "Investment Name"
  ["region"]=>
  string(6) "London"
  ["sector"]=>
  string(6) "Office"
  ["status"]=>
  string(8) "Published"
  ["description"]=>
  string(0) ""
  ["acquisition_date"]=>
  string(0) ""
  ["size"]=>
  string(0) ""
  ["address_line_1"]=>
  string(0) ""
  ["address_line_2"]=>
  string(0) ""
  ["city"]=>
  string(6) "London"
  ["county"]=>
  string(0) ""
  ["postcode"]=>
  string(0) ""
  ["longitude"]=>
  string(0) ""
  ["latitude"]=>
  string(0) ""
  ["featured"]=>
  string(0) ""
  ["external_link"]=>
  string(0) ""
}