PHP Iterables
PHP – co je iterovatelný?
Iterovatelná je jakákoli hodnota, kterou lze procházet foreach()
smyčkou.
Pseudotyp iterable
byl zaveden v PHP 7.1 a lze jej použít jako datový typ pro argumenty funkcí a návratové hodnoty funkcí.
PHP - Použití Iterables
Klíčové iterable
slovo lze použít jako datový typ argumentu funkce nebo jako návratový typ funkce:
Příklad
Použijte argument iterovatelné funkce:
<?php
function printIterable(iterable $myIterable) {
foreach($myIterable as $item) {
echo $item;
}
}
$arr = ["a",
"b", "c"];
printIterable($arr);
?>
Příklad
Vrátit iterovatelný:
<?php
function getIterable():iterable {
return ["a", "b", "c"];
}
$myIterable = getIterable();
foreach($myIterable as $item) {
echo $item;
}
?>
PHP – vytváření iterables
Pole
Všechna pole jsou iterovatelná, takže jakékoli pole lze použít jako argument funkce, která vyžaduje iterovatelnost.
Iterátory
Jakýkoli objekt, který implementuje Iterator
rozhraní, lze použít jako argument funkce, která vyžaduje iterovatelnost.
Iterátor obsahuje seznam položek a poskytuje metody pro jejich procházení. Udržuje ukazatel na jeden z prvků v seznamu. Každá položka v seznamu by měla mít klíč, který lze použít k nalezení položky.
Iterátor musí mít tyto metody:
current()
- Vrátí prvek, na který aktuálně ukazuje ukazatel. Může to být jakýkoli datový typkey()
Vrátí klíč spojený s aktuálním prvkem v seznamu. Může to být pouze celé číslo, float, boolean nebo řetězecnext()
Přesune ukazatel na další prvek v seznamurewind()
Přesune ukazatel na první prvek v seznamuvalid()
Pokud interní ukazatel neukazuje na žádný prvek (například pokud byla na konci seznamu volána funkce next(), mělo by to vrátit hodnotu false. V každém jiném případě vrátí hodnotu true
Příklad
Implementujte rozhraní Iterator a použijte jej jako iterovatelné:
<?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);
?>