Для создания кастомного алгоритма итерации по свойствам объекта, можно использовать интерфейс 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