PHP中foreach内while循环仅首次执行问题求助
问题原因
第一次foreach迭代时,while($row = fgetcsv($allroutes))会把CSV文件的内容全部读取完毕,此时文件指针停留在文件末尾。后续foreach迭代再调用fgetcsv时,因为指针已经在末尾,直接返回false,导致while循环根本不会执行,所以没有任何输出。
解决方案
有两种常用的修复方式:
方案1:每次迭代前重置文件指针
在每次foreach循环开始时,用rewind()函数把文件指针重置到文件开头,这样每次都能重新遍历整个CSV文件:
foreach ($selectedpaths as $path) { echo "<BR>working on this: " . $path . "<BR>"; // 重置文件指针到文件起始位置 rewind($allroutes); #run through the csv while ($row = fgetcsv($allroutes)) { echo "."; #fetch entries that match if ($row[5] == $path) { // 注意:$row是数组,需用implode转成字符串输出 echo "<BR>" .$row[5] . " == " . $path ." MATCH " . implode(',', $row) . "<BR>"; } } }
适用场景:CSV文件较大,不想一次性加载到内存中。
方案2:先把CSV内容加载到内存数组
一次性读取整个CSV文件到内存数组中,后续foreach迭代直接遍历内存中的数组,避免多次读取文件:
// 先读取整个CSV到内存数组 $csvRows = []; while ($row = fgetcsv($allroutes)) { $csvRows[] = $row; } // 读取完成后关闭文件句柄 fclose($allroutes); foreach ($selectedpaths as $path) { echo "<BR>working on this: " . $path . "<BR>"; foreach ($csvRows as $row) { echo "."; if ($row[5] == $path) { echo "<BR>" .$row[5] . " == " . $path ." MATCH " . implode(',', $row) . "<BR>"; } } }
适用场景:CSV文件较小,内存占用可控,这种方式效率更高。
额外提示
原代码中echo $row会输出字符串Array,因为$row是fgetcsv返回的数组,需要用implode(',', $row)将数组转为逗号分隔的字符串才能正确显示内容。
内容的提问来源于stack exchange,提问作者Brick
相关产品推荐
相关产品推荐

