即使索引存在,数组上的未定义偏移量为1

时间:2014-02-05 12:38:28

标签: laravel-4

我有一个问题,我无法解释自己。我认为这可能是PHP或Laravel的错误 - 或者我正在做一些我不应该做的事情。

我有一个包含国家/地区代码和国家/地区名称的.csv文件

CSV file

我想读取文件并使用数据为我的数据库播种。 因此,我有以下代码将CSV转换为数组:

 $csv = public_path() . "/assets/countries.csv";
   if(File::exists($csv)) {
     $content = File::get($csv);
     $lines = array();
     $lines = explode("\n", $content);

     for($i=0; $i<sizeof($lines);$i++) {
        $line = $lines[$i];
        $line = explode(",",$line);
        $lines[$i] = $line;
     }
 }

到目前为止,我的$ lines数组现在具有所有值,每个值都是一个包含2个索引的数组,0代表代码,1代表国家/地区名称。

做foreach($ lines as $ line)和var dumping $ line,我得到:

 array(2) { [0]=> string(2) "AF" [1]=> string(12) "Afghanistan " } 
 .....

每个条目。但现在发生了以下情况:

 echo $line[0]; // output: AF
 echo $line[1]; // undefined offset 1 error

我试图检查1是否是字符串索引或者是什么,请参阅以下代码+输出:

 foreach($lines as $line) {
    var_dump($line);
    echo 'array_key_exists(1, $line): ';
    var_dump(array_key_exists(1, $line));
    foreach($line as $key => $col) {
      echo 'var_dump($key): ';
      var_dump($key);
      echo '$col: ' . $col;
      echo '$line[$key]: ' . $line[$key];
    }
 }

(为了便于阅读,我删除了一些回显的中断) 代码产生以下输出(对于第一个结果,对于所有其他结果类似):

 array(2) { [0]=> string(2) "AF" [1]=> string(12) "Afghanistan " } 
 array_key_exists(1, $line): bool(true) 

 var_dump($key): int(0) 
 $col: AF
 $line[$key]: AFvar_dump($key): int(1) 
 $col: Afghanistan 
 $line[$key]: Afghanistan 

array_key_exists(1, $line)如何导致true,但$line[1]在未定义的偏移中:1错误?谢谢你的帮助。

编辑:$line[$key]正在运行,而$line[1]则没有。在这种情况下,var_dump(1 == $ key)会导致bool(true)...

EDIT2:如果我使用相同的代码而不使用laravel(然后是file_get_contents) - 我没有收到错误。见this fiddle for the code

1 个答案:

答案 0 :(得分:1)

我是傻瓜。感谢来自laravel.io的人我意识到错误既不在PHP内也不在Laravel中,而是在我的数据中。

.csv文件中有一个空的最后一行。该文件无法展开,导致$lines[249](最后一个条目)中只有一个值。

我的借口。