未定义的偏移量

时间:2013-08-15 18:17:11

标签: php arrays while-loop offset

我正在尝试运行此代码:

$file = fopen($txtFile, "r");    
    while(!feof($file)) {    
        $line = fgets($file);    
        $pieces = explode(",", $line);    

    $date = $pieces[0];
    $open = $pieces[1];
    $high = $pieces[2];
    $low = $pieces[3];
    $close = $pieces[4];
    $volume = $pieces[5];
}

我收到了这个通知:

未定义的偏移:1中... 未定义的偏移量:2英寸... 未定义的偏移量:3英寸... 未定义的偏移:4英寸...
未定义的偏移量:5英寸......

为什么?

2 个答案:

答案 0 :(得分:2)

正如斯蒂芬所说,看起来这个阵列并不像你期望的那样,你可以做一些事情。

尝试使用

var_dump($pieces)

并查看数组实际包含的内容。 您可以采取的另一项措施是防止错误并在代码中更具防御性,如下所示:

$file = fopen($txtFile, "r");    
while(!feof($file)) {    
    $line = fgets($file);    
    $pieces = explode(",", $line);    

if(isset($pieces[0]))
    $date = $pieces[0];
if(isset($pieces[1]))
    $open = $pieces[1];
if(isset($pieces[2]))
    $high = $pieces[2];
if(isset($pieces[3]))
    $low = $pieces[3];
if(isset($pieces[4]))
    $close = $pieces[4];
if(isset($pieces[5]))
    $volume = $pieces[5];
}
}

或者在这种情况下你可以检查$ pieces的长度,这可能会更好更短,如下所示:

$file = fopen($txtFile, "r");    
while(!feof($file)) {    
    $line = fgets($file);    
    $pieces = explode(",", $line);    

if(sizeof($pieces) != 6){
  //handle this case here
}
else
{
    $date = $pieces[0];
    $open = $pieces[1];
    $high = $pieces[2];
    $low = $pieces[3];
    $close = $pieces[4];
    $volume = $pieces[5];
}
}

这只是确保在尝试对它们执行任何操作之前存在变量,并且将避免未定义索引的问题。

答案 1 :(得分:0)

我假设您的文件格式如下:

日期,开放,高,低,关闭,体积

日期,开放,高,低,关闭,体积

我认为问题在于您的文件格式不正确。

调试问题的一种方法是var_dump($ pieces);

另外我想你忘了通过调用fclose($ file);

来关闭文件句柄

这是一个更简单的OOP解决方案:

$file = new SplFileObject( '/home/jason/file.csv', 'r' );
$file->setFlags( SplFileObject::READ_CSV );

foreach ( $file as $lineNumber => $line ) {

    var_dump( $line ); // $line is an array

}

有关详情,请参阅http://www.php.net/manual/en/class.splfileobject.php

希望这会有所帮助:)