【发布时间】:2012-11-15 15:13:49
【问题描述】:
我有一个 csv 文件,我试图将其转换为不同的结构化数组。首先,我把它变成一个名为 all_data() 的数组,构造如下:
$data = file_get_contents($id . '.csv');
$data_array = explode("\n", $data);
foreach($data_array AS $data){
$all_data[] = explode("\t", $data);
}
结果如下所示:
array(5) {
[0]=>
array(2) {
[0]=>
string(10) "2012-11-14"
[1]=>
string(2) "10"
}
[1]=>
array(2) {
[0]=>
string(10) "2012-11-14"
[1]=>
string(2) "10"
}
[2]=>
array(2) {
[0]=>
string(10) "2012-11-14"
[1]=>
string(2) "10"
}
[3]=>
array(2) {
[0]=>
string(10) "2012-11-14"
[1]=>
string(2) "10"
}
[4]=>
array(1) {
[0]=>
string(0) ""
}
}
然后我用下面的代码把它变成 im_arr():
foreach($all_data as $key => $value){
$im_arr[$key][$value[0]] = $value[1];
}
结果:
array(5) {
[0]=>
array(1) {
["2012-11-14"]=>
string(2) "10"
}
[1]=>
array(1) {
["2012-11-14"]=>
string(2) "10"
}
[2]=>
array(1) {
["2012-11-14"]=>
string(2) "10"
}
[3]=>
array(1) {
["2012-11-14"]=>
string(2) "10"
}
[4]=>
array(1) {
[""]=>
NULL
}
}
然后,最后另一个 foreach 循环给出了我正在寻找的结果:
foreach ($im_arr as $val) {
foreach ($val as $key => $val2) {
$im_data[$key]=$val2;
}
}
im_data() 的结果是:
array(2) {
["2012-11-14"]=>
string(2) "10"
[""]=>
NULL
}
这将是完美的,因为数组 im_data() 正是我想从 all_data() 中得到的。但是,当我尝试将此代码放入程序的另一部分时,它不起作用,我认为这可能是因为我收到了警告:
"PHP 注意:未定义的偏移量:1 in ... on line 93"
第 93 行对应这一行:
$im_arr[$key][$value[0]] = $value[1];
下面是完整的部分代码:
$all_data = array();
$im_arr=array();
$data = file_get_contents($id . '.csv');
$data_array = explode("\n", $data);
foreach($data_array AS $data){
$all_data[] = explode("\t", $data);
}
foreach($all_data as $key => $value){
$im_arr[$key][$value[0]] = $value[1]; //the line for the error
}
$im_data=array();
foreach ($im_arr as $val) {
foreach ($val as $key => $val2) {
$im_data[$key]=$val2;
}
}
var_dump($im_data);
我知道针对同一错误发布了许多问题,但我无法弄清楚这段特定代码的问题。
【问题讨论】:
-
在添加键之前创建子数组。
if(!array_key_exists($key, $im_arr)) { $im_arr[$key] = array(); }。或者 MarcB 所说,您的某些值的格式不正确。 -
您的文件中可能至少有一行没有
\t,因此您在$all_data 中至少有一个没有1索引的条目。 -
有道理,但我仍然收到相同的错误通知。
-
Marc B:这就是为什么我得到最后一个数组元素的“” => NULL?我将如何解决这个问题?
-
是的,这就是问题所在,只需在处理它们之前检查它们是否已设置:
if (isset($value[0]) && isset($value[1])) { process data! }
标签: php arrays foreach compiler-errors