这个foreach循环是否对上帝杀猫负责?

时间:2011-07-24 00:09:23

标签: php file foreach

取自https://stackoverflow.com/questions/4891301/top-bad-practices-in-php

这个类似的代码也会杀死小猫吗?

foreach (file("longFile.txt") as $line) {
    // ouch! Kitten killed
}

...

对于那些不知道我在说什么的人:

每次进入下一行文件时,PHP都会获得longFile.txt吗?谈论这段代码:

foreach (file("longFile.txt") as $line) {
        // something
}

5 个答案:

答案 0 :(得分:5)

在链接的问题中,for循环通过在每次迭代时调用count来引起性能损失。 foreach使用内部指针迭代传递给它的数组。

在您的示例中,file()将被调用一次,结果数组将传递给foreach,它将遍历它,从而保存小猫。 Happy Caturday!

答案 1 :(得分:1)

它不应该杀死任何小猫,因为,为了让PHP获取文件的下一行,它必须知道文件指针的位置,因为上一行被拉掉了。您只是推进了迭代器,它保留了对文件对象的引用。

此外,打开这样的文件是不好的做法;你应该有一个变量来存储它并在你完成后关闭它。

答案 2 :(得分:1)

该文件真的大吗?考虑:

foreach(new SplFileObject($path) as $line) {
    // neither kill puppies nor kittens
}

foreach总是在具体的迭代器上工作。如果您传递array

  

除非引用了数组,否则foreach将对指定数组的副本进行操作,而不是对数组本身进行操作。 (ref)

因此,每次array步骤都会执行foreach或函数调用。

相关:How to store and reset a PHP array pointer?

答案 3 :(得分:1)

您想使用Duff设备展开循环:http://de.wikipedia.org/wiki/Duff%E2%80%99s_Device。这将比foreach更快,然后更快,而不是在每次迭代时使用count(),并且它会更快,然后连接和rtrim字符串,但是使用implode()相同。

答案 4 :(得分:0)

没有。小猫死亡的原因有很多,但是foreach循环不是其中之一。