Является ли этот цикл foreach ответственным за убийство богов кошками? - PullRequest
3 голосов
/ 24 июля 2011

взято из 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 ]

5 голосов
/ 24 июля 2011

В связанном вопросе цикл for вызывает снижение производительности, вызывая count на каждой итерации. foreach использует внутренние указатели для перебора массива, переданного ему.

В вашем примере file() будет вызван один раз, и полученный массив будет передан в foreach, который будет проходить через него, таким образом, котята будут сохранены. С Днем Рождения!

1 голос
/ 24 июля 2011

Вы хотите использовать Duff Device для развертывания цикла: http://de.wikipedia.org/wiki/Duff%E2%80%99s_Device. Это будет быстрее, чем foreach, и быстрее, чем для цикла без использования count () на каждой итерации, и будет быстрее, чем конкатенация и обратное преобразованиестрока, но такая же, как при использовании implode ().

1 голос
/ 24 июля 2011

Этот файл действительно большой?Обратите внимание:

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

foreach всегда работает на конкретном итераторе.Если вы передаете array:

Если на массив не есть ссылки, foreach работает с копией указанного массива, а не с самим массивом. (ref)

Так что ни array, ни вызов функции не будут выполняться каждый раз, когда foreach шаги впереди.

Связанные: Каксохранить и сбросить указатель на массив PHP?

1 голос
/ 24 июля 2011

Это не должно убивать каких-либо котят, так как для того, чтобы PHP получил следующую строку файла, он должен знать позицию указателя файла с предыдущей строки, которая была удалена. Вы только продвигаете итератор, который поддерживает ссылку на объект файла.

Кроме того, открывать такой файл - плохая практика; у вас должна быть переменная для хранения и закрытия, когда вы закончите.

0 голосов
/ 04 мая 2012

Нет.Есть много причин, почему котята умирают, но петли foreach не являются одной из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...