Stasgar
@Stasgar
Обученная макака

ArrayIterator — что такое и зачем нужен?

Начал изучать SPL, постепенно скатился к теме итераторов.

Не могу понять что делает ArrayIterator. Примеров в интернете нет, его всегда используют в IteratorAggregate. В документации написано: "Этот итератор позволяет сбрасывать и модифицировать значения и ключи в процессе итерации по массивам и объектам." - это всё очень хорошо, но каким образом он это позволяет делать?

Как вообще это использовать?
  • Вопрос задан
  • 1712 просмотров
Решения вопроса 1
mhthnz
@mhthnz
PHP, YII2, Golang, Linux
Любой объект можно представить в виде массива, элементами в нем будут публичные свойства.
Мы можем обращаться к объекту как к массиву.
<?php
class a {
    public $a = 1;
    public $b = 2;
}
$obj = new a();
foreach ($obj as $value) {
    echo $value.'|';
}
//1|2
?>

Итераторы позволяют подсунуть вместо свойств объекта, свой массив и проводить итерации по нему. Тут уже мы итерируем приватное свойство класса, которое представляет из себя массив.
<?php
class MyIterator implements Iterator
{
    private $var = array();

    public function __construct($array)
    {
        if (is_array($array)) {
            $this->var = $array;
        }
    }

    public function rewind()
    {
        echo "перемотка в начало\n";
        reset($this->var);
    }
  
    public function current()
    {
        $var = current($this->var);
        echo "текущий: $var\n";
        return $var;
    }
  
    public function key() 
    {
        $var = key($this->var);
        echo "ключ: $var\n";
        return $var;
    }
  
    public function next() 
    {
        $var = next($this->var);
        echo "следующий: $var\n";
        return $var;
    }
  
    public function valid()
    {
        $key = key($this->var);
        $var = ($key !== NULL && $key !== FALSE);
        echo "верный: $var\n";
        return $var;
    }

}

$values = array(1,2,3);
$it = new MyIterator($values);

foreach ($it as $a => $b) {
    print "$a: $b\n";
}
?>

php.net/manual/ru/language.oop5.iterations.php
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы