0

我正在尝试运行此代码:

$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 in ...
未定义偏移:2 in ...
未定义偏移:3 in ...
未定义偏移:4 in ...
未定义偏移:5 in ...

为什么?

4

2 回答 2

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];
}
}

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

于 2013-08-15T18:33:19.310 回答
0

我假设您的文件具有以下格式:

日期,打开,高,低,关闭,音量

日期,打开,高,低,关闭,音量

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

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

另外我认为您忘记通过调用 fclose( $file ); 来关闭文件句柄

这是一个更简单的面向对象的解决方案:

$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

希望这可以帮助 :)

于 2013-08-15T19:22:22.533 回答