Pull to refresh

Comments 17

Абсолютное несоответствие заголовка и содержания.
Заголовок не очень у вашей статьи. Возможно, стоит сменить название на что-то вроде "… или работа с итераторами в PHP". Я ожидал другого содержания и получил не нужную мне в данный момент информацию. А кто-то, кто ищет про итераторы пройдет мимо.
Стоило бы упомянуть про одно из главных преимуществ итераторов перед массивами — меньший объем потребляемой памяти.
Где бы об этом подробно почитать? В мануале информации маловато.
На самом деле, в мануале информации достаточно много, просто бОльшая ее часть — в комментариях. Там и примеры кода есть, в частности. Я еще на StackOverflow достаточно большое кол-во информации почерпнул.
Спорное утверждение. В таком кейсе это массив завёрнутый в объект Iterator, он должны быть более прожорливым и медленнее чистых масивов, не говоря уже об spl-вских.

Главное, что итератор позволяет итерировать то, что НЕ является массивом — строки файлов, записи в БД, ноды в XML и.т.д.
по работе я сталкивался с парсингом xml ~1Гб
Если делать это простыми средствами (аля simple_load_xml) то чтобы все отработало (разумеется не просто распарсить его, а еще и обработать) требуется в районе 15-20Гб выделенной только под php памяти.
При использовании xmlIterator памяти требуется лишь — размер файла плюс затраты на операции по обработке данных (обычно не более 2х).

SimpleXML как раз реализует итераторы, там даже есть SimpleXMLIterator.
xmlIterator — это видимо библиотека для потоковой обработки, вроде xmlreader, к итераторам это отношения не имеет, так как принцип работы у них разный, один загружает документ целиком и парсит, второй читает части до токенов.

p.s. Экстеншины в php могут юзать свою память и выходить за пределы лимита в конфиге, этакая багофича.
Ну точно я не помню название, но юзал я не библиотеку а коробочную функцию.
А по поводу simple_load_xml это далеко не итератор. Возможно в более поздних версиях да, но на старых (парсил я достаточно давно — было дело на 5.2) он создавал массив, и ничего не итерировал ;)
Так это всё счастье появилось с версии 5.0, данная функция возвращала объект имплементирующий Traversable, можете в доках проверить.
Главное, что итератор позволяет итерировать то, что НЕ является массивом — строки файлов, записи в БД, ноды в XML и.т.д.

Согласен. Есть еще один пример, который не вошел в статью (хотел добавить, но не смог найти код с примером) — разбор файлов построчно и потом парсинг.

Постараюсь на днях найти и обновить пост, раз уж речь зашла.
Нагляднее будет, если вы добавите пример с базой, вместо fetchAll, передадите $tilesStmt, а в next() будет обходить дёргать запись через fetch().
Но это уже фактически будет генератор, так как подтягивает данные, а не работает с уже извлечённой структурой.
генераторы в пхп?!
ниверю! (с)

>тот-же итератор
а вот тут вы не правы, уж извините.

PS.
кстати, о вашем примере:
>foreach ($tilesStmt->fetchAll()
сразу же загрузит весь результат в память, правильнее делать так:
while (false !== $title = $tilesStmt->fetch()) yield $title;
Sign up to leave a comment.

Articles