【问题标题】:PHP Error: Undefined offset error within foreach loopPHP 错误:foreach 循环中未定义的偏移量错误
【发布时间】: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


【解决方案1】:

这就是问题所在:

[4]=>
  array(1) {
    [0]=>
    string(0) ""
  }

在添加到$im_arr之前,只需检查数据是否已设置,并且不为空:

foreach ($all_data as $key => $value) { 
  if (isset($value[0]) && isset($value[1]) && !empty($value[0]) && !empty($value[1])) {
    $im_arr[$key][$value[0]] = $value[1];
  }
}

【讨论】:

    【解决方案2】:

    对于每个 foreach,我都会预先检查第一个参数是否为数组

    例如;

    //Just add line below for every foreach (and add any required else statement if needed)
    if(is_array($im_arr))
    foreach ($im_arr as $val) {
        if(is_array($val))
        foreach ($val as $key => $val2) {
            $im_data[$key]=$val2;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      相关资源
      最近更新 更多