取自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
}
答案 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
或函数调用。
答案 3 :(得分:1)
您想使用Duff设备展开循环:http://de.wikipedia.org/wiki/Duff%E2%80%99s_Device。这将比foreach更快,然后更快,而不是在每次迭代时使用count(),并且它会更快,然后连接和rtrim字符串,但是使用implode()相同。
答案 4 :(得分:0)
没有。小猫死亡的原因有很多,但是foreach循环不是其中之一。