SPL Iterators


Базовые понятия
Итераторы (Iterators) — это классы которые реализуют интерфейс Iterator. Реализация данного интерфейса необходима при организации доступа к циклическим структурам (массивы, списки и т.д.).

В SPL (Standard PHP Library) существует большое количество готовых классов, реализующих интерфейс Iterator.

Далее перечислены классы, которые непосредственно реализуют интерфейс Iterator: Traversable, IteratorAgregate, OuterIterator, RecursiveIterator. Остальные классы-итераторы SPL наследуют свои интерфейсы уже от них.

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

Так как интерфейс Iterator входит в библиотеку стандартных классов PHP (Standard PHP Library), то его реализация выполнена в исходниках самого интерпретатора (имеются в виду коды программы на языке «С»). Если выразить этот интерфейс на языке PHP, то он будет выглядеть так:

interface Iterator{
  public function current(); // возвращает значение текущего элемента
  public function key(); // возвращает значения текущего ключа элемента (индекс массива например)
  public function next(); // смещает указатель на следующий элемент
  public function rewind(); // смещает указатель на первый элемент
  public function valid(); // определяет наличие элемента (выполняется после next или rewind)
}


Итераторы могут быть использованы во многих областях программирования. Например, при обработке набора значений полученных из Базы данных или обработке значений массива, или обработке набора файлов и т.д.

Вспомогательные функции при работе с итераторами.

iterator_to_array(Iterator $iteratorObject) — возвращает содержимое объекта-итератора в виде массива.

iterator_count(Iterator $iteratorObject)) — возвращает количество элементов в объекте-итераторе.

Пример использования:


$a = Array('a', 'b', 'c');
$iterator = new ArrayIterator($a);
echo iterator_count($iterator); // Результат - 3


iterator_apply(Iterator iteratorObject, function callback, [user_data) — данная функция позволяет с помощью callback-а обработать каждый элемент содержащийся в объекте-итераторе.

Пример использования:

function print_entry($iteratorObject) {
   var_dump($iterator->current());
   return true;
}

$a = Array('a', 'b', 'c');
$iterator = new ArrayIterator($a);
iterator_apply($iterator, 'print_entry', array($iterator));


Если функция callback возвращает значение отличное от true перебор элементов объекта-итератора прекращается.
  • 0
  • 24 июля 2010, 23:17
  • admin

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.