ArrayIterator クラス
(PHP 5, PHP 7, PHP 8)
はじめに
このイテレータは、配列やオブジェクトを反復処理する際に 値やキーを修正したり、要素を削除することができます。
同じ配列を何度も反復処理したい場合は、 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 — 現在の配列キーを返す
- 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 — 配列がまだエントリを持っているかどうかチェックする
+add a note
User Contributed Notes 4 notes
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.
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"));
?>
Sean Burlington ¶
15 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
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);
?>