PHP Conference Japan 2024

ArrayIterator 類別

(PHP 5, PHP 7, PHP 8)

簡介

允許在迭代陣列物件時移除元素,以及修改鍵或值。

若要多次迭代同一個陣列,建議實例化 ArrayObject 並使用 ArrayIterator 實例,該實例可以在使用 foreach 迭代內部儲存的陣列時隱式建立,或者透過手動呼叫 ArrayObject::getIterator() 方法來建立。

類別概要

類別 ArrayIterator 實作 SeekableIteratorArrayAccessSerializableCountable {
/* 常數 */
公開 常數 int STD_PROP_LIST;
公開 常數 int ARRAY_AS_PROPS;
/* 方法 */
公開 __construct(陣列|物件 $array = [], int $flags = 0)
公開 append(混合 $value): void
公開 asort(int $flags = SORT_REGULAR): true
公開 count(): int
公開 current(): 混合
公開 getFlags(): int
公開 key(): 字串|int|null
公開 ksort(int $flags = SORT_REGULAR): true
公開 natcasesort(): true
公開 natsort(): true
公開 next(): void
公開 offsetExists(混合 $key): bool
公開 offsetGet(混合 $key): 混合
公開 offsetSet(混合 $key, 混合 $value):
公開 offsetUnset(混合 $key):
公開 rewind():
公開 seek(整數 $offset):
公開 serialize(): 字串
公開 setFlags(整數 $flags):
公開 uasort(可呼叫 $callback):
公開 uksort(可呼叫 $callback):
公開 unserialize(字串 $data):
公開 valid(): 布林
}

預定義常數

ArrayIterator 旗標

ArrayIterator::STD_PROP_LIST

當物件的屬性以列表方式存取時(var_dump()foreach 等),它們具有正常的功用。

ArrayIterator::ARRAY_AS_PROPS

項目可以作為屬性(讀取和寫入)來存取。

目錄

新增註記

使用者貢獻的註記 4 則註記

Venelin Vulkov
16 年前
另一個來自 PHP 的優秀迭代器。當您必須迭代物件時,您可以特別使用它。

<?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();

// 我們要迭代多少項目?

echo "迭代次數: " . $obj->count() . " 個值\n";

// 迭代 ArrayObject 中的值:
while( $it->valid() )
{
echo
$it->key() . "=" . $it->current() . "\n";
$it->next();
}

// 這裡的好處是它可以使用 foreach 迴圈迭代

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

/* 輸出類似以下的內容 */

迭代次數: 4 個值
apple
=yummy
orange
=ah ya, nice
grape
=wow, I love it!
plum=nah, not me

?>

此致。
Relakuyae
13 年前
需要對迭代值進行回呼,但沒有 PHP 5.4+?這讓它變得非常簡單。

<?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);
}
}
?>

您可以像使用 Array Iterator 一樣使用它

<?php
$iterator1
= new ArrayCallbackIterator($valueList, "callback_function");
$iterator2 = new ArrayCallbackIterator($valueList, array($object, "callback_class_method"));
?>
Sean Burlington
15 年前
要遞迴迭代,請使用(文件稀少的)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";

?>

輸出
--------
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 年前
文件說明「這個迭代器允許在迭代陣列和物件時取消設定和修改值和鍵」。但如果您將陣列傳遞給建構函式,迭代器會使用該陣列的副本,因此修改不會寫回初始陣列。ArrayObject 的行為方式相同。

如果您想要一個寫回陣列的迭代器,您可以使用這個函式

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

用法

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

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

//陣列(2) {
// [1]=>
// 字串(2) "ax"
// [2]=>
// &字串(2) "bx"
//}
//物件(Generator)#4 (0) {
//}
var_dump($array);
var_dump($iterator);

?>

與一般陣列、ArrayIterator 和 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