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
// Создать итератор
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);
?>
Попробуйте сами »