Итерируемые объекты PHP
В PHP итерируемый объект (iterable) — это значение, которое можно перебирать с помощью цикла
foreach().
Псевдотип iterable был представлен в PHP 7.1 и может использоваться как тип данных для аргументов функций и возвращаемых значений функций.
Итерируемым объектом может быть массив или объект, реализующий интерфейс Iterator.
PHP - Использование итерируемых объектов
Ключевое слово iterable может использоваться как тип данных параметра функции или как возвращаемый тип функции:
Пример
Итерируемый параметр функции:
<?php
function printIterable(iterable $x) {
foreach($x as $item) {
echo $item;
}
}
// Вызов с массивом:
printIterable(["a", "b", "c"]);
//
Вызов с объектом:
$iterator = new ArrayIterator(["d", "e", "f"]);
printIterable($iterator);
?>
Попробуйте сами »
Пример
Итерируемый возвращаемый тип:
<?php
function getIterable():iterable {
return ["a", "b", "c"];
}
foreach(getIterable() as $item) {
echo $item;
}
?>
Попробуйте сами »
PHP - Создание итерируемых объектов
Массивы
Все массивы являются итерируемыми, поэтому любой массив может использоваться в качестве аргумента функции, требующей итерируемый объект.
Итераторы
Любой объект, реализующий интерфейс Iterator, может использоваться в качестве аргумента функции, требующей итерируемый объект.
Итератор содержит список элементов и предоставляет методы для перебора этих элементов. Он хранит указатель на один из элементов списка. Каждый элемент в списке должен иметь ключ, который можно использовать для поиска элемента.
Итератор должен иметь следующие методы:
current()- Возвращает элемент, на который в данный момент указывает указатель. Может быть любого типа данныхkey()- Возвращает ключ, связанный с текущим элементом в списке. Может быть только целым числом, числом с плавающей точкой, булевым значением или строкойnext()- Перемещает указатель на следующий элемент в спискеrewind()- Перемещает указатель на первый элемент в спискеvalid()- Если внутренний указатель не указывает ни на какой элемент (например, если next() был вызван в конце списка), этот метод должен возвращать false. В любом другом случае возвращает true
Пример
Реализуйте интерфейс Iterator и используйте его как итерируемый объект:
<?php
// Создаем итератор
class MyIterator implements Iterator {
private $items = [];
private $pointer = 0;
public
function __construct($items) {
// array_values() гарантирует, что ключами являются числа
$this->items =
array_values($items);
}
public function current() {
return $this->items[$this->pointer];
}
public function
key() {
return $this->pointer;
}
public function next() {
$this->pointer++;
}
public function rewind() {
$this->pointer =
0;
}
public function valid() {
// count() показывает, сколько элементов в списке
return $this->pointer < count($this->items);
}
}
//
Функция, которая использует итерируемые объекты
function printIterable(iterable $myIterable) {
foreach($myIterable as $item) {
echo $item;
}
}
// Используем итератор как итерируемый объект
$iterator = new MyIterator(["a", "b", "c"]);
printIterable($iterator);
?>
Попробуйте сами »