Comments 17
Абсолютное несоответствие заголовка и содержания.
Заголовок не очень у вашей статьи. Возможно, стоит сменить название на что-то вроде "… или работа с итераторами в PHP". Я ожидал другого содержания и получил не нужную мне в данный момент информацию. А кто-то, кто ищет про итераторы пройдет мимо.
Стоило бы упомянуть про одно из главных преимуществ итераторов перед массивами — меньший объем потребляемой памяти.
Где бы об этом подробно почитать? В мануале информации маловато.
Спорное утверждение. В таком кейсе это массив завёрнутый в объект Iterator, он должны быть более прожорливым и медленнее чистых масивов, не говоря уже об spl-вских.
Главное, что итератор позволяет итерировать то, что НЕ является массивом — строки файлов, записи в БД, ноды в XML и.т.д.
Главное, что итератор позволяет итерировать то, что НЕ является массивом — строки файлов, записи в БД, ноды в XML и.т.д.
по работе я сталкивался с парсингом xml ~1Гб
Если делать это простыми средствами (аля simple_load_xml) то чтобы все отработало (разумеется не просто распарсить его, а еще и обработать) требуется в районе 15-20Гб выделенной только под php памяти.
При использовании xmlIterator памяти требуется лишь — размер файла плюс затраты на операции по обработке данных (обычно не более 2х).
Если делать это простыми средствами (аля simple_load_xml) то чтобы все отработало (разумеется не просто распарсить его, а еще и обработать) требуется в районе 15-20Гб выделенной только под php памяти.
При использовании xmlIterator памяти требуется лишь — размер файла плюс затраты на операции по обработке данных (обычно не более 2х).
SimpleXML как раз реализует итераторы, там даже есть SimpleXMLIterator.
xmlIterator — это видимо библиотека для потоковой обработки, вроде xmlreader, к итераторам это отношения не имеет, так как принцип работы у них разный, один загружает документ целиком и парсит, второй читает части до токенов.
p.s. Экстеншины в php могут юзать свою память и выходить за пределы лимита в конфиге, этакая багофича.
xmlIterator — это видимо библиотека для потоковой обработки, вроде xmlreader, к итераторам это отношения не имеет, так как принцип работы у них разный, один загружает документ целиком и парсит, второй читает части до токенов.
p.s. Экстеншины в php могут юзать свою память и выходить за пределы лимита в конфиге, этакая багофича.
Ну точно я не помню название, но юзал я не библиотеку а коробочную функцию.
А по поводу simple_load_xml это далеко не итератор. Возможно в более поздних версиях да, но на старых (парсил я достаточно давно — было дело на 5.2) он создавал массив, и ничего не итерировал ;)
А по поводу simple_load_xml это далеко не итератор. Возможно в более поздних версиях да, но на старых (парсил я достаточно давно — было дело на 5.2) он создавал массив, и ничего не итерировал ;)
Главное, что итератор позволяет итерировать то, что НЕ является массивом — строки файлов, записи в БД, ноды в XML и.т.д.
Согласен. Есть еще один пример, который не вошел в статью (хотел добавить, но не смог найти код с примером) — разбор файлов построчно и потом парсинг.
Постараюсь на днях найти и обновить пост, раз уж речь зашла.
в php 5.5 появились yield
function getTiles()
$tilesStmt = PDO::prepare(«SELECT * FROM tiles… LIMIT 9»);
$tilesStmt->execute();
foreaf ($tilesStmt->fetchAll() as $title) {
yield $title;
}
}
foreach (getTiles() as $title) {
var_dump($title);
}
www.php.net/manual/en/language.generators.syntax.php
тот-же итератор
function getTiles()
$tilesStmt = PDO::prepare(«SELECT * FROM tiles… LIMIT 9»);
$tilesStmt->execute();
foreaf ($tilesStmt->fetchAll() as $title) {
yield $title;
}
}
foreach (getTiles() as $title) {
var_dump($title);
}
www.php.net/manual/en/language.generators.syntax.php
тот-же итератор
habraintersector.nkt.me/ — в общем выложил… Если упадет — я не виноват)
PS а оно уже падает… судя по всему код приложения сначала выкачивает хабы, а потом отдает.
PS а оно уже падает… судя по всему код приложения сначала выкачивает хабы, а потом отдает.
Sign up to leave a comment.
Что общего у gamedev-а с космонавтикой или работа с итераторами в PHP