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.ArrayIterator
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
ArrayIterator
Референца за `class.arrayiterator.php` со подобрена типографија и навигација.
Класата ArrayIterator
класата mysqli_driver
Вовед
Овозможува отстранување на елементи и измена на клучеви или вредности при итерација arrayили objects.
За да се итерира истата низа повеќе од еднаш, се препорачува да се инстанцира ArrayObject и да се користи
ArrayIterator инстанца или имплицитно креирана при користење на foreach за итерација на низата што се чува внатрешно, или да се креира една со повикување на ArrayObject::getIterator() метод рачно.
Синопсис на класата
Претходно дефинирани константи
Знаменца на ArrayIterator
ArrayIterator::STD_PROP_LIST-
Својствата на објектот ја имаат својата нормална функционалност кога се пристапува како листа (var_dump(),
foreach, итн.). ArrayIterator::ARRAY_AS_PROPS-
Записите може да се пристапуваат како својства (читање и пишување).
Содржина
- ArrayIterator::append — Додај елемент
- ArrayIterator::asort — Сортирај записи по вредности
- ArrayIterator::__construct — Конструирај ArrayIterator
- ArrayIterator::count — Број елементи
- ArrayIterator::current — Врати тековен запис од низата
- ArrayIterator::getArrayCopy — Земи копија од низата
- ArrayIterator::getFlags — Земи знаменца за однесување
- ArrayIterator::key — Return current array 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 — Десеријализирај
Белешки од корисници 4 белешки
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);
?>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