如何在读取文件和使用fopen填充数组时修复无限循环?

时间:2014-01-28 13:56:36

标签: php fopen

我想读取一个文件并填充一个空数组。

这是我的代码:

$savedList = array();

readFile1($savedList, "test.txt");

function readFile1($array, $filename){

    $handle = fopen($filename, "r");
    $numElements = count($array);

    while (!feof($handle)) {
        foreach ($array as $x){
            $array[$x] = fgets($handle);
        }   
    }

    fclose($handle);        
}

使用上面的代码,我收到以下错误:

  

致命错误:超过30秒的最长执行时间

我该如何解决?

4 个答案:

答案 0 :(得分:2)

为什么您的代码不起作用

如果文件指针位于TRUE ,则函数feof()会返回EOF。在所有其他情况下,它返回FALSE。在您的代码中,$array在开头始终为空,并且foreach中的任何代码都不会被执行。因此文件指针将始终位于文件的开头(它永远不会到达结尾),这意味着feof($handle)将始终返回FALSE

基本上,您的代码转换为:

while (TRUE) {
    foreach (array() as $x){
        /*
        code here will never get executed
        */
    }   
}

看起来像一个无限循环,对吗?您的脚本超时,然后PHP抛出致命错误。

可以采取哪些措施来解决问题

对于您想要完成的任务,不需要foreach。您已经在使用while循环,因此您无需遍历$array - 这是毫无意义的。只需在下面的代码中声明一个计数器变量($x),并使用它来创建数组索引:

function readFile1($array, $filename){

    $handle = fopen($filename, "r");
    $numElements = count($array);

    $x = 0;
    while (!feof($handle)) {
        $array[$x] = fgets($handle);
        $x++;
    }

    fclose($handle);     
    return $array;   
}

请注意,上面的$x变量仅用于演示目的。如果您确实希望拥有基于0的数组索引,那么您只需使用[]语法或array_push()将每一行推送到数组即可。例如:

while (!feof($handle)) {
    $array[] = fgets($handle);
}

现在,调用函数并存储返回的数组并按照您的意愿使用它:

$arr = readFile1($savedList, "test.txt");
print_r($arr);

答案 1 :(得分:0)

  • 您将从一个空数组$ savedList开始,并将其传递给参数$ array
  • 您将$ numElements设置为$ array的大小,即零
  • 您正在根据未到达文件末尾的条件进行循环
  • 您正在空数组上运行foreach,因此文件中的位置永远不会提前
  • ......然后循环继续......

答案 2 :(得分:0)

问题是你将两个循环嵌套在一起。

内部循环执行完全为零次,这意味着fgets无法将文件位置推向eof,这就是外部循环永远不会终止的原因。

function readFile1($filename){
    $handle = fopen($filename, "r");
    $array = array();
    while (!feof($handle)) {
        $array[] = fgets($handle);
    }
    fclose($handle);
    return $array;
}

答案 3 :(得分:0)

假设$array已预先填充...您的foreach ($array as $x){通过值迭代(与通过array_values()的结果迭代相同),但您希望$x拥有foreach ($array as $x => $value){ $array[$x] = fgets($handle); } 基于密钥(迭代低谷array_keys())的值,该语法为supported by foreach

{{1}}