Итерируемый тип данных «Iterable».

Для создания кастомного алгоритма итерации по свойствам объекта, можно использовать интерфейс Iterator.

Интерфейс Iterator состоит из пяти методов, каждый из которых можно реализовать под любые задачи.

//Возвращает значение текущего элемента
public function current();

//Возвращает ключ текущего элемента
public function key();

//Сдвигает "указатель" на следующий элемент
public function next(): void;

//Сдвигает "указатель" на первый элемент
public function rewind(): void;

//Проверяет - не вышел ли указатель за границы.
public function valid(): bool;

На следующем примере можно увидеть вариант реализации интерфейса Iterator

<?

class ShowIterator implements Iterator
{

    private $stor = [];

    public function set($key, $val)
    {
        $this->stor[$key] = $val;
    }

    public function get($key)
    {
        return $this->stor[$key];
    }

    public function current()
    {
        return current($this->stor);
    }

    public function key()
    {
        return key($this->stor);
    }

    public function next(): void
    {
        next($this->stor);
    }

    public function rewind(): void
    {
        reset($this->stor);
    }

    public function valid(): bool
    {
        return null !== key($this->stor);
    }

}

$for_iterable = new ShowIterator();
$for_iterable->set('town', 'Chickago');
$for_iterable->set('layer', 42);
$for_iterable->set('car', 'Porshe');

$for_iterable->next(); // перемещаем "указатель" вперед, на ключ "layer"
echo($for_iterable->current().'<br>'); // 42
echo($for_iterable->key().'<br>'); // layer
echo($for_iterable->get('car').'<br>'); // Получаем значение, с ключем "car"
$for_iterable->rewind(); // перемещаем указатель назад, на ключ "town"
echo($for_iterable->key().'<br>'); // town

// итерация по объекту
foreach ($for_iterable as $key => $val) {
    echo $key . ' => ' . $val;
    echo "<br>";
}
// В результате получим:
//42
//layer
//Porshe
//town
//town => Chickago
//layer => 42
//car => Porshe

Добавить комментарий