Iterables de PHP
PHP - ¿Qué es un iterable?
Un iterable es cualquier valor que se puede recorrer con un foreach()
bucle.
El iterable
pseudotipo se introdujo en PHP 7.1 y se puede usar como un tipo de datos para argumentos de funciones y valores de retorno de funciones.
PHP - Uso de iterables
La iterable
palabra clave se puede utilizar como tipo de datos de un argumento de función o como tipo de retorno de una función:
Ejemplo
Use un argumento de función iterable:
<?php
function printIterable(iterable $myIterable) {
foreach($myIterable as $item) {
echo $item;
}
}
$arr = ["a",
"b", "c"];
printIterable($arr);
?>
Ejemplo
Devuelve un iterable:
<?php
function getIterable():iterable {
return ["a", "b", "c"];
}
$myIterable = getIterable();
foreach($myIterable as $item) {
echo $item;
}
?>
PHP - Creación de iterables
arreglos
Todos los arreglos son iterables, por lo que cualquier arreglo se puede usar como argumento de una función que requiere un iterable.
iteradores
Cualquier objeto que implemente la Iterator
interfaz se puede usar como argumento de una función que requiere un iterable.
Un iterador contiene una lista de elementos y proporciona métodos para recorrerlos. Mantiene un puntero a uno de los elementos de la lista. Cada elemento de la lista debe tener una clave que se puede utilizar para encontrar el elemento.
Un iterador debe tener estos métodos:
current()
- Devuelve el elemento al que apunta actualmente el puntero. Puede ser cualquier tipo de datokey()
Devuelve la clave asociada con el elemento actual en la lista. Solo puede ser un número entero, flotante, booleano o cadenanext()
Mueve el puntero al siguiente elemento de la lista.rewind()
Mueve el puntero al primer elemento de la lista.valid()
Si el puntero interno no apunta a ningún elemento (por ejemplo, si se llamó a next() al final de la lista), debería devolver falso. Devuelve verdadero en cualquier otro caso.
Ejemplo
Implemente la interfaz Iterator y utilícela como iterable:
<?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);
?>