powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Итераторы в пхп.
18 сообщений из 18, страница 1 из 1
Итераторы в пхп.
    #38552096
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Люди, кому приходилось пользоваться и как часто?
А то оказалось, что в пхп есть такая штука, у меня спросили, и мне как-то стало стыдно, что что-то такое базовое, а я не знаю :). Один я её не пользую вообще (то есть получается мне ниразу не потребовалось за всё время работы), или это настолько малоизвестная и невостребованная штуковина?

В общем интересно, был ли у кого случай, когда обойтись без итераторов было просто невозможно, или возможно, но затратно (или небезопасно).
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38552101
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RecursiveDirectoryIterator/DirectoryIterator клевые штуки.
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38552108
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowRecursiveDirectoryIterator/DirectoryIterator клевые штуки.

Ну да... выглядит удобно очень. А меня интересует именно использование самого интерфейса Iterator. То есть был ли он где-то востребован? Не просто, можно так или так, а именно, что без него невозможно, или возможно, но хреново :)
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38552127
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эм. да везде где надо что то сложнее массива. например XPath возвращает итератор.
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38552243
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowэм. да везде где надо что то сложнее массива. например XPath возвращает итератор.

А почему например разработчики посчитали нужным возвращать именно итератор, а не например объект с методом getResult (или типа того), в котором был бы записан тот самый массив (функционал которого в принципе и реализуется с использованием интерфейса iterator)?

Я об этом говорю... То что его используют - это понятно. Вопрос то в том, что можно ли не затрачивая лишних ресурсов и времени сделать ровно то же самое без его использования? Или его использование обусловлено не предпочтениями программиста, а конкретным фактом (то есть иначе было бы сложнее, или иначе скрипт выполнялся бы не за 0.1 секунды, а за 2 секунды... etc)
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38552246
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора не например объект с методом getResult (или типа того), в котором был бы записан тот самый массив (
http://www.php.net/manual/en/class.arrayobject.php
rrayObject implements IteratorAggregate , ArrayAccess , Serializable , Countable {
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38554833
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр,

В рамке Yii все барахло собирается в массив под эгидой интерфейсов массива. Для простых вещей несуразные ресурсы.
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38555213
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрсделать ровно то же самое без его использования?
дело не в производительности, а в универсальности. итераторы позволяют работать с данными просто и понятно, даже не зная о внутренних особенностях и взаимосявязах данных в коллекции(контейнере).

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

простой пример: есть некая древовидная структура. необходимо обойти ВСЕ элементы этого дерева.

-решение без итераторов: програмисту необходимо самому делать всю работу. делать цикл, определять есть ли у элемента потомки, если есть - обходить всех потомков рекурсивно, следить что мы не вышли за пределы ветки. следить за индексами элементов, увеличивая и уменьшая их своевременно.....

-решение с итераторами: использовать простой цикл перебора итераторов. тоесть использовать очень просто и быстро. не нужно делать нам лишней работы. все уже сделано за нас. код получается простой и понятный. следовательно - в нем меньше ошибок... и т.д. в общем - плюсы в этом.
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38555231
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

На js такими вещами не парятся пользуясь тем, что любая сущность там в сущности объект, а все объекты в сущности массивы со всеми вытекающими готовыми интерфейсами.

Что можно повторить на любом языке полагаю.

Из своей практики. Нарисовал однажды класс для бд. Указываешь ему бд, он ее превращает в кучу объектов и по запросу засасывает данные, обогащая мету сведениями из схемы. Все было прелестно, но совершенно не итераторно. Оценивая будущий геморрой с обрудованием класса итераторами, агрегаторами, каунтаблями и прочей тряхомудией я вспомнил что скрипт рожден умереть - это ж не тред в памяти на пол-года - и выкосил весь это прелестный класс и сделал вот так

$_f = $link->fetch_fields(); // fetch_fields() returns array of stdClass' objects
$_i=array();
foreach($_f as $field)
$_i[$field->name] = $field; // разумеется идентификаторы в запросе должны быть уникальным

И все. Теперь если мне нужен доступ по индексу я беру $_f[$index]; а если по имени то $_i[$field_name];

Это мета. Дату можно профтыкать и по имени и по индексу.
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38555247
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
debloggerЭто мета. Дату можно профтыкать и по имени и по индексу.
да никто не против. делать нужно так как удобнее для решения конкретной задачи.
я просто привел пример когда итераторы могут быть предпочтительнее. но вариантов много.
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38555258
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

Там не все так просто. Вы не станете обвешивать каждый класс итераторами, вы напишите итерационный класс с которого начнете наследоваться. Это приведет к тому же самому, о чем вы пишите. Восхождение от абстракции к конкретике потребует туевой хучи долбанутых проверок в сеттерах-геттерах типа пропарсить кусок строки от символа 3 до символа 7.

ну а если станете - то через неделю уже станет понятно что размер данных получаемых через увешанные итераторами, агрегаторами и прочей тряхомудией классы в разы меньше чем код самих этих классов.
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38555287
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
debloggerВы не станете обвешивать каждый класс итераторам
каждый конечно не стану, но и отказываться от итераторов не буду, в случае если увижу профит от его использования для конкретной задачи.

почему всегда крайности? ненужны они для ВСЕХ классов. отказываться полностью тоже нет смысла. но иногда нужны и удобны. вот иногда и можно их реализовать.

о чем спор то?
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38555374
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uПрограмёрсделать ровно то же самое без его использования?
дело не в производительности, а в универсальности. итераторы позволяют работать с данными просто и понятно, даже не зная о внутренних особенностях и взаимосявязах данных в коллекции(контейнере).

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

простой пример: есть некая древовидная структура. необходимо обойти ВСЕ элементы этого дерева.

-решение без итераторов: програмисту необходимо самому делать всю работу. делать цикл, определять есть ли у элемента потомки, если есть - обходить всех потомков рекурсивно, следить что мы не вышли за пределы ветки. следить за индексами элементов, увеличивая и уменьшая их своевременно.....

-решение с итераторами: использовать простой цикл перебора итераторов. тоесть использовать очень просто и быстро. не нужно делать нам лишней работы. все уже сделано за нас. код получается простой и понятный. следовательно - в нем меньше ошибок... и т.д. в общем - плюсы в этом.

Древовидная структура - это имеется ввиду в формате nested sets, или в виде уже преобразованного дерева?
Если второе - вообще не вижу проблемы. У меня есть класс-обёртка, у которого в свойстве хранится многоуровневый массив (ну то есть само дерево). Всё что надо - это рекурсивная функция everyChild, которая последним параметром принимает callback функцию, в которой заложена логика, что надо делать с каждым элементом

Если первое - да в принципе всё то же самое (кроме входных параметров... там будет не элемент-родитель вписываться, а левый и правый индекс родителя), в случае, если во время обхода нас интересует путь к элементу... Если же не интересует, то everyChild превратится в everyElement, которая уже не будет рекурсивной. В принципе, это 10 строчек кода... :))

А вот как это делать итераторами, я не совсем понял... как они помогут? можете вкратце логику пояснить?
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38555394
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрА вот как это делать итераторами, я не совсем понял... как они помогут? можете вкратце логику пояснить?
что пояснить? как это будет выглядеть?
Код: php
1.
2.
3.
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator("./")) as $key=>$val) {
    echo $key,"=>",$val,"\n";
}


понимаете что тут происходит? обходим дерево директории.
будете писать сами будет 10 строк. а тут две строки. в этом и удобство.

считаете это неудобным? дело ваше. я ничего вам доказывать не собираюсь.
все что я хотел сказать по теме - я сказал. далее делайте выводы сами.
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38555491
deblogger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

О чем я выше и писал http://www.php.net/manual/en/class.recursiveiteratoriterator.php и в итераторе папок наверняка не меньше.

На бейсике - да пожалуйста. Мегабайтом мемори больше, мегабайтом меньше - фигня. И конечно стопицот юзеров не ломятся каждую секунду запускать мою апликуху с жирным слоем классов для виндовой API. У каждого - своя и каждый запустив ее может хоть целый год не закрывать. У меня так ФШ вечно открыт, кстати.

Между тем веб еще не такой как десктоп. Не по ресурсам, конечно, в самом своем принципе.
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38555871
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uПрограмёрА вот как это делать итераторами, я не совсем понял... как они помогут? можете вкратце логику пояснить?
что пояснить? как это будет выглядеть?
Код: php
1.
2.
3.
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator("./")) as $key=>$val) {
    echo $key,"=>",$val,"\n";
}


понимаете что тут происходит? обходим дерево директории.
будете писать сами будет 10 строк. а тут две строки. в этом и удобство.

считаете это неудобным? дело ваше. я ничего вам доказывать не собираюсь.
все что я хотел сказать по теме - я сказал. далее делайте выводы сами.

я не собираюсь спорить :) Я пытаюсь понять, потому и прошу объяснить... Про 10 строк, я имел ввиду саму реализацию класса, а не его использование.

При этом, то что у Вас в двух строках запишется так:
Код: php
1.
$myClassObject->everyChild(null, function($key, $val){echo "$key=>$val";})



То есть и это в 2 строки можно записать (а если функция простая как тут - вообще в одну). Отсюда и тема... Могут ли итераторы реально помочь пхп программисту? Или их использование зависит от предпочтений того самого программиста?

Ведь обёртку для массива создать как нефиг делать... ))
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38555893
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрВедь обёртку для массива создать как нефиг делать... ))
итераторы это инструмент. если его применение оправданно, то это помогает сделать работу с коллекцией более удобной и безопасной.

кстати, вот есть в пхп foreach(){}
ведь это по сути и есть итератор. мы не задаем условий обхода, а просто просим пройтись по всем элементам массива. удобно ведь? вот вам яркий пример когда применение итераторов позволяет решать задачу, а не отвлекаться на несущественные особенности коллекции.
...
Рейтинг: 0 / 0
Итераторы в пхп.
    #38556426
авторВедь обёртку для массива создать как нефиг делать... ))
всё уже украдено до нас!!!
http://www.php.net/manual/en/class.iterator.php
http://www.php.net/manual/en/spl.iterators.php

ме думает проблема не конкретно в итераторах а в интерфейсах и их использовании!!! ;)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Итераторы в пхп.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]