Итерации PHP
PHP — что такое итерируемый объект?
Итерируемый объект — это любое значение, которое может быть пройдено foreach()
циклом.
Псевдотип iterable
был представлен в PHP 7.1, и его можно использовать как тип данных для аргументов функции и возвращаемых значений функции.
PHP — использование итерируемых объектов
Ключевое iterable
слово может использоваться как тип данных аргумента функции или как возвращаемый тип функции:
Пример
Используйте итерируемый аргумент функции:
<?php
function printIterable(iterable $myIterable) {
foreach($myIterable as $item) {
echo $item;
}
}
$arr = ["a",
"b", "c"];
printIterable($arr);
?>
Пример
Вернуть итерируемый объект:
<?php
function getIterable():iterable {
return ["a", "b", "c"];
}
$myIterable = getIterable();
foreach($myIterable as $item) {
echo $item;
}
?>
PHP — Создание итерируемых объектов
Массивы
Все массивы являются итерируемыми, поэтому любой массив можно использовать в качестве аргумента функции, для которой требуется итерируемый объект.
Итераторы
Любой объект, реализующий Iterator
интерфейс, может быть использован в качестве аргумента функции, для которой требуется итерируемый объект.
Итератор содержит список элементов и предоставляет методы для их перебора. Он хранит указатель на один из элементов списка. Каждый элемент в списке должен иметь ключ, который можно использовать для поиска элемента.
Итератор должен иметь следующие методы:
current()
- Возвращает элемент, на который в данный момент указывает указатель. Это может быть любой тип данныхkey()
Возвращает ключ, связанный с текущим элементом в списке. Это может быть только целое число, число с плавающей запятой, логическое значение или строка.next()
Перемещает указатель к следующему элементу в спискеrewind()
Перемещает указатель к первому элементу в спискеvalid()
Если внутренний указатель не указывает ни на один элемент (например, если next() была вызвана в конце списка), это должно вернуть false. Возвращает true в любом другом случае
Пример
Реализуйте интерфейс Iterator и используйте его как итерируемый объект:
<?php
// Create an Iterator
class MyIterator implements Iterator {
private $items = [];
private $pointer = 0;
public
function __construct($items) {
// array_values() makes
sure that the keys are numbers
$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() indicates how many items are in the list
return $this->pointer < count($this->items);
}
}
// A
function that uses iterables
function printIterable(iterable $myIterable) {
foreach($myIterable as $item) {
echo $item;
}
}
// Use the iterator as an iterable
$iterator = new MyIterator(["a", "b", "c"]);
printIterable($iterator);
?>