Итерация в PHP

Итерация простого объекта

<?php
 
namespace ITReviewChannel;
 
/**
 * Пользователь.
 *
 * @package ITReviewChannel
 */
class User
{
    /**
     * @var string $name Имя.
     */
    public string $name;
    /**
     * @var int $age Возраст.
     */
    public int $age;
 
    /**
     * @var float $balance Баланс.
     */
    protected float $balance;
    /**
     * @var string $status Статус.
     */
    private string $status;
 
    /**
     * Конструктор.
     */
    public function __construct()
    {
        $this->name = 'Иван Иванов';
        $this->age = 20;
        $this->balance = 100.00;
        $this->status = 'active';
    }
 
    /**
     * Итерирование.
     */
    public function iterate(): void
    {
        foreach ($this as $property => $value) {
            echo $property . ' > ' . $value . PHP_EOL;
        }
    }
}
 
$user = new User();
 
foreach ($user as $property => $value) {
    echo $property . ' > ' . $value . PHP_EOL;
}
 
echo PHP_EOL . '--------------------------' . PHP_EOL . PHP_EOL;
 
$user->iterate();

Вывод:

name > Иван Иванов
age > 20
 
--------------------------
 
name > Иван Иванов
age > 20
balance > 100
status > active

Итерация через стандартный интерфейс PHP

<?php
 
namespace ITReviewChannel;
 
/**
 * Свой итератор.
 *
 * @package ITReviewChannel
 */
class MyIterator implements \Iterator
{
    /**
     * @var array $elements Элементы.
     */
    private array $elements;
 
    /**
     * Конструктор.
     *
     * @param  array  $array  Элементы.
     */
    public function __construct(array $array)
    {
        $this->elements = $array;
    }
 
    /**
     * {@inheritDoc}
     */
    public function rewind()
    {
        echo 'Возврат к началу.' . PHP_EOL;
 
        reset($this->elements);
    }
 
    /**
     * {@inheritDoc}
     */
    public function current()
    {
        $element = current($this->elements);
 
        echo 'Текущий элемент: ' . $element . PHP_EOL;
 
        return $element;
    }
 
    /**
     * {@inheritDoc}
     */
    public function key()
    {
        $key = key($this->elements);
 
        echo 'Ключ текущего элемента: ' . $key . PHP_EOL;
 
        return $key;
    }
 
    /**
     * {@inheritDoc}
     */
    public function next()
    {
        $element = next($this->elements);
 
        echo 'Следующий элемент: ' . $element . PHP_EOL;
 
        return $element;
    }
 
    /**
     * {@inheritDoc}
     */
    public function valid()
    {
        $key = key($this->elements);
 
        $result = ($key !== null && $key !== false);
 
        echo 'Правильность позиции: ' . $result . PHP_EOL;
 
        return $result;
    }
}
 
foreach (new MyIterator([1, 2, 3]) as $key => $value) {
    echo $key . ' > ' . $value . PHP_EOL . PHP_EOL;
}
 
echo PHP_EOL . '--------------------------' . PHP_EOL . PHP_EOL;
 
/**
 * Своя коллекция.
 *
 * @package ITReviewChannel
 */
class MyCollection implements \IteratorAggregate
{
    /**
     * @var array $elements Элементы.
     */
    private array $elements;
 
    /**
     * Конструктор.
     *
     * @param  array  $elements  Элементы.
     */
    public function __construct(array $elements)
    {
        $this->elements = $elements;
    }
 
    /**
     * {@inheritDoc}
     */
    public function getIterator()
    {
        return new MyIterator($this->elements);
    }
}
 
foreach (new MyCollection(['Value 1', 'Value 2', 'Value 3']) as $key => $value) {
    echo 'Ключ/значение: [' . $key . ' > "' . $value . '"]' . PHP_EOL . PHP_EOL;
}

Вывод:

Возврат к началу.
Правильность позиции: 1
Текущий элемент: 1
Ключ текущего элемента: 0
0 > 1
 
Следующий элемент: 2
Правильность позиции: 1
Текущий элемент: 2
Ключ текущего элемента: 1
1 > 2
 
Следующий элемент: 3
Правильность позиции: 1
Текущий элемент: 3
Ключ текущего элемента: 2
2 > 3
 
Следующий элемент:
Правильность позиции:
 
--------------------------
 
Возврат к началу.
Правильность позиции: 1
Текущий элемент: Value 1
Ключ текущего элемента: 0
Ключ/значение: [0 > "Value 1"]
 
Следующий элемент: Value 2
Правильность позиции: 1
Текущий элемент: Value 2
Ключ текущего элемента: 1
Ключ/значение: [1 > "Value 2"]
 
Следующий элемент: Value 3
Правильность позиции: 1
Текущий элемент: Value 3
Ключ текущего элемента: 2
Ключ/значение: [2 > "Value 3"]
 
Следующий элемент:
Правильность позиции:

Полезные ссылки

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