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"));
?>
Класс ArrayIterator
(PHP 5)
Введение
Этот итератор позволяет сбрасывать и модифицировать значения и ключи в процессе итерации по массивам и объектам.
Когда вы хотите перебрать некоторый массив несколько раз, вы должны создать экземпляр ArrayObject и позволить ему создать экземпляр ArrayIterator, ссылающийся на него при использовании foreach, или при вызове метода getIterator() вручную.
Обзор классов
ArrayIterator
implements
Iterator
,
Traversable
,
ArrayAccess
,
SeekableIterator
,
Countable
,
Serializable
{
/* Методы */
}Содержание
- 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 — Проверяет, содержит ли массив еще записи
Relakuyae
19-Oct-2011 05:23
foobuilder at gmail dot com
09-Dec-2010 11:01
Unsetting all keys of an ArrayItem within foreach will always leave the second key:
<?php
$items = new ArrayObject(range(0, 9));
while (list($k, $v) = each($items)) {
unset($items[$k]);
}
print_r($items);
// ArrayIterator Object
// (
// [storage:ArrayIterator:private] => Array
// (
// [1] => 1
// )
// )
?>
I'm not sure if this is a bug as unsetting keys within foreach is usually a bad idea to begin with (use while instead), but it's something to be aware of.
liranuna at liranuna dot com
02-Dec-2009 06:44
If you want to make your ArrayIterator support foreach loops with PHP's & operator, such as
<?php
foreach($list as &$item) {
....
}
?>
You will need to pass the array to ArrayIterator by reference:
<?php
new ArrayIterator(&$array);
?>
Sean Burlington
26-May-2009 05:15
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
Venelin Vulkov
11-Nov-2008 03:44
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.
