Перейти к основному содержимому

Итерируемые объекты в PHP

Итерируемый объект (iterable) в PHP — это любое значение, которое можно перебрать с помощью цикла foreach().

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

Подходят значения двух видов: массивы и объекты, реализующие интерфейс Iterator.


PHP — использование iterable

Укажите iterable как тип параметра функции или как возвращаемый тип функции:

Пример

Функция, принимающая итерируемый параметр, вызывается один раз с массивом и один раз с объектом:

Prompt
Создайте PHP-функцию printIterable, которая принимает параметр типа iterable и выводит каждый элемент. Вызовите её с массивом ["a", "b", "c"], а также с объектом ArrayIterator, содержащим ["d", "e", "f"].
Вывод: PHP-скрипт

Пример

Функция, возвращаемый тип которой — iterable:

Prompt
Создайте PHP-функцию getIterable с типом возвращаемого значения iterable, которая возвращает массив ["a", "b", "c"]. С помощью цикла foreach выведите каждый элемент из возвращённого iterable.
Вывод: PHP-скрипт

PHP — создание итерируемых объектов

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

То же относится и к объектам: любой объект, реализующий Iterator, также принимается.

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

Ваш итератор должен определять эти пять методов:

  • current() — возвращает элемент под указателем, который может быть любого типа данных
  • key() — возвращает ключ текущего элемента, который может быть только целым числом, числом с плавающей точкой, логическим значением или строкой
  • next() — перемещает указатель на один элемент вперёд
  • rewind() — возвращает указатель на первый элемент
  • valid() — возвращает true, пока внутренний указатель находится на элементе. Метод должен возвращать false, когда указатель не находится ни на каком элементе, например после вызова next() в конце списка

Пример

Здесь класс реализует Iterator, а его объект затем передаётся в функцию как итерируемое значение:

Prompt
Создайте PHP-класс MyIterator, который реализует интерфейс Iterator с методами current(), key(), next(), rewind() и valid(). Затем создайте функцию printIterable(), которая проходит по iterable и выводит каждый элемент. Используйте MyIterator с элементами ["a", "b", "c"].
Вывод: PHP-скрипт