Forum PHP 2025

Класс ArrayIterator

(PHP 5, PHP 7, PHP 8)

Введение

Класс разрешает удаление элементов, и изменение ключей или значений при итерации по массивам или объектам.

Для многократного перебора одного и того же массива рекомендуют создавать экземпляр класса ArrayObject. Конструктор класса принимает исходный массив и сохраняет массив внутренне. Затем к элементам внутреннего массива обращаются либо путём передачи объекта ArrayObject в конструкцию foreach, при которой объект массива неявно создаёт экземпляр итератора ArrayIterator, либо путём вызова метода ArrayObject::getIterator() вручную.

Обзор класса

class ArrayIterator implements SeekableIterator, ArrayAccess, Serializable, Countable {
/* Константы */
public const int STD_PROP_LIST;
public const int ARRAY_AS_PROPS;
/* Методы */
public __construct(array|object $array = [], int $flags = 0)
public append(mixed $value): void
public asort(int $flags = SORT_REGULAR): true
public count(): int
public current(): mixed
public getFlags(): int
public key(): string|int|null
public ksort(int $flags = SORT_REGULAR): true
public natcasesort(): true
public natsort(): true
public next(): void
public offsetExists(mixed $key): bool
public offsetGet(mixed $key): mixed
public offsetSet(mixed $key, mixed $value): void
public offsetUnset(mixed $key): void
public rewind(): void
public seek(int $offset): void
public serialize(): string
public setFlags(int $flags): void
public uasort(callable $callback): true
public uksort(callable $callback): true
public unserialize(string $data): void
public valid(): bool
}

Предопределённые константы

Флаги ArrayIterator

ArrayIterator::STD_PROP_LIST

При установке флага свойства объекта сохраняют стандартное поведение. Вызов на объекте функции var_dump() показывает, что свойства хранятся стандартно, а во внутреннее хранилище попадают только элементы массива. При итерации по объекту языковой конструкцией foreach или другими средствами доступа к спискам выдаются только элементы хранилища. При этом доступ к элементам хранилища возможен только через квадратные скобки.

ArrayIterator::ARRAY_AS_PROPS

При установке флага свойства объекта и элементы массива сохраняются во внутреннем хранилище и при итерации по объекту выдаются как элементы единого списка. Флаг разрешает обращаться к элементам внутреннего хранилища для чтения или записи как через синтаксис квадратных скобок, так и через оператор доступа к свойствам объекта.

Содержание

Добавить

Примечания пользователей 4 notes

up
50
Venelin Vulkov
16 years ago
Another fine Iterator from php . You can use it especially when you have to iterate over objects

<?php
$fruits
= array(
"apple" => "yummy",
"orange" => "ah ya, nice",
"grape" => "wow, I love it!",
"plum" => "nah, not me"
);
$obj = new ArrayObject( $fruits );
$it = $obj->getIterator();

// How many items are we iterating over?

echo "Iterating over: " . $obj->count() . " values\n";

// Iterate over the values in the ArrayObject:
while( $it->valid() )
{
echo
$it->key() . "=" . $it->current() . "\n";
$it->next();
}

// The good thing here is that it can be iterated with foreach loop

foreach ($it as $key=>$val)
echo
$key.":".$val."\n";

/* Outputs something like */

Iterating over: 4 values
apple
=yummy
orange
=ah ya, nice
grape
=wow, I love it!
plum=nah, not me

?>

Regards.
up
18
Relakuyae
13 years ago
Need a callback on an iterated value, but don't have PHP 5.4+? This makes is stupid easy:

<?php
class ArrayCallbackIterator extends ArrayIterator {
private
$callback;
public function
__construct($value, $callback) {
parent::__construct($value);
$this->callback = $callback;
}

public function
current() {
$value = parent::current();
return
call_user_func($this->callback, $value);
}
}
?>

You can use it pretty much exactly as the Array Iterator:

<?php
$iterator1
= new ArrayCallbackIterator($valueList, "callback_function");
$iterator2 = new ArrayCallbackIterator($valueList, array($object, "callback_class_method"));
?>
up
10
Sean Burlington
16 years ago
and to iterate recursively use the (sparsely documented) RecursiveArrayIterator

<?php

$fruits
= array(
"apple" => "yummy",
"orange" => "ah ya, nice",
"grape" => "wow, I love it!",
"plum" => "nah, not me"
);

$veg = array("potato" => "chips", "carrot" => "soup");
$grocery = array($fruits, $veg);
$obj = new ArrayObject( $grocery );

$it = new RecursiveIteratorIterator( new RecursiveArrayIterator($grocery));

foreach (
$it as $key=>$val)
echo
$key.":".$val."\n";

?>

Output
--------
apple:yummy
orange:ah ya, nice
grape:wow, I love it!
plum:nah, not me
potato:chips
carrot:soup
up
1
butesa at freenet dot de
2 years ago
The documentation states "This iterator allows to unset and modify values and keys while iterating over Arrays and Objects". But if you pass an array to the constructor, the iterator works with a copy of that array, so the modifications will not be written back to that initial array. ArrayObject behaves the same way.

If you want an iterator that writes back to the array, you can use this function:

<?php
function &getArrayIterator(array &$a): Iterator {
foreach (
$a as $k => &$v) {
yield
$k => $v;
}
}
?>

Usage:

<?php
$array
= [1 => 'a', 2 => 'b'];

$iterator = getArrayIterator($array);
foreach (
$iterator as &$value) {
$value .= 'x';
}

//array(2) {
// [1]=>
// string(2) "ax"
// [2]=>
// &string(2) "bx"
//}
//object(Generator)#4 (0) {
//}
var_dump($array);
var_dump($iterator);

?>

Comparison with plain array, ArrayIterator and ArrayObject:

<?php
$array1
= [1 => 'a', 2 => 'b'];
$array2 = [1 => 'a', 2 => 'b'];
$array3 = [1 => 'a', 2 => 'b'];

foreach (
$array1 as &$value) {
$value .= 'x';
}

$iterator2 = new ArrayIterator($array2);
foreach (
$iterator2 as &$value) {
$value .= 'x';
}

$iterator3 = new ArrayObject($array3);
foreach (
$iterator3 as &$value) {
$value .= 'x';
}

//array(2) {
// [1]=>
// string(2) "ax"
// [2]=>
// string(2) "bx"
//}
var_dump($array1);

//array(2) {
// [1]=>
// string(1) "a"
// [2]=>
// string(1) "b"
//}
//object(ArrayIterator)#1 (1) {
// ["storage":"ArrayIterator":private]=>
// array(2) {
// [1]=>
// string(2) "ax"
// [2]=>
// string(2) "bx"
// }
//}
var_dump($array2);
var_dump($iterator2);

//array(2) {
// [1]=>
// string(1) "a"
// [2]=>
// string(1) "b"
//}
//object(ArrayObject)#2 (1) {
// ["storage":"ArrayObject":private]=>
// array(2) {
// [1]=>
// string(2) "ax"
// [2]=>
// string(2) "bx"
// }
//}
var_dump($array3);
var_dump($iterator3);
?>
To Top