我想读取一个文件并填充一个空数组。
这是我的代码:
$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秒的最长执行时间
我该如何解决?
答案 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)
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}}