Класс ArrayIterator
(PHP 5, PHP 7)
Введение
Этот итератор позволяет сбрасывать и модифицировать значения и ключи в процессе итерации по массивам и объектам.
Когда вы хотите перебрать некоторый массив несколько раз, вы должны создать экземпляр ArrayObject и позволить ему создать экземпляр ArrayIterator, ссылающийся на него при использовании foreach, или при вызове метода getIterator() вручную.
Обзор классов
/* Методы */
}Содержание
- ArrayIterator::append — Добавить элемент
- ArrayIterator::asort — Сортирует массив по значениям
- ArrayIterator::__construct — Создает ArrayIterator
- ArrayIterator::count — Посчитать количество элементов
- ArrayIterator::current — Возвращает текущий элемент в массиве
- ArrayIterator::getArrayCopy — Возвращает копию массива
- ArrayIterator::getFlags — Получает флаги
- ArrayIterator::key — Возвращает ключ текущего элемента массива
- ArrayIterator::ksort — Сортирует массив по ключам
- ArrayIterator::natcasesort — Сортирует массив "натурально", с учетом регистра
- ArrayIterator::natsort — Сортирует массив "натурально"
- ArrayIterator::next — Перемещает указатель за следующую запись
- ArrayIterator::offsetExists — Проверяет существует ли смещение
- ArrayIterator::offsetGet — Получает значение для смещения
- ArrayIterator::offsetSet — Устанавливает значение для смещения
- ArrayIterator::offsetUnset — Сбрасывает значение по смещению
- ArrayIterator::rewind — Перемещает указатель в начало массива
- ArrayIterator::seek — Перемещает указатель на выбранную позицию
- ArrayIterator::serialize — Сериализует массив
- ArrayIterator::setFlags — Устанавливает флаги, управляющие поведением
- ArrayIterator::uasort — Сортировка, определенная пользователем
- ArrayIterator::uksort — Сортировка, определенная пользователем
- ArrayIterator::unserialize — Десериализация
- ArrayIterator::valid — Проверяет, содержит ли массив еще записи
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Другие базовые расширения
- Стандартная библиотека PHP (SPL)
- Класс AppendIterator
- Класс ArrayIterator
- Класс CachingIterator
- Класс CallbackFilterIterator
- Класс DirectoryIterator
- Класс EmptyIterator
- Класс FilesystemIterator
- Класс FilterIterator
- Класс GlobIterator
- Класс InfiniteIterator
- Класс IteratorIterator
- Класс LimitIterator
- Класс MultipleIterator
- Класс NoRewindIterator
- Класс ParentIterator
- Класс RecursiveArrayIterator
- Класс RecursiveCachingIterator
- Класс RecursiveCallbackFilterIterator
- Класс RecursiveDirectoryIterator
- Класс RecursiveFilterIterator
- Класс RecursiveIteratorIterator
- Класс RecursiveRegexIterator
- Класс RecursiveTreeIterator
- Класс RegexIterator
Коментарии
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.
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
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"));
?>
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);
?>