PHP 大会日本 2024

ArrayIterator 类

(PHP 5、PHP 7、PHP 8)

简介

允许在迭代数组对象时删除元素以及修改键或值。

要多次迭代同一个数组,建议实例化ArrayObject并使用ArrayIterator实例(在使用foreach迭代内部存储的数组时隐式创建,或者通过手动调用ArrayObject::getIterator()方法创建)。

类概要

class ArrayIterator implements SeekableIterator, ArrayAccess, Serializable, Countable {
/* 常量 */
public const int STD_PROP_LIST;
public const int ARRAY_AS_PROPS;
/* 方法 */
public __construct(array|object $array = [], int $flags = 0)
public append(mixed $value): void
public asort(int $flags = SORT_REGULAR): true
public count(): int
public current(): mixed
public getFlags(): int
public key(): string|int|null
public ksort(int $flags = SORT_REGULAR): true
public natcasesort(): true
public natsort(): true
public next(): void
public offsetExists(mixed $key): bool
public offsetGet(mixed $key): mixed
public offsetSet(mixed $key, mixed $value): void
public offsetUnset(mixed $key): void
public rewind(): void
public seek(int $offset): void
public serialize(): string
public setFlags(int $flags): void
public uasort(callable $callback): true
public uksort(callable $callback): true
public unserialize(string $data): void
public valid(): bool
}

预定义常量

ArrayIterator 标志

ArrayIterator::STD_PROP_LIST

对象的属性在作为列表访问时 (var_dump()foreach 等) 具有其正常功能。

ArrayIterator::ARRAY_AS_PROPS

条目可以作为属性访问(读写)。

目录

添加注释

用户贡献的注释 4 条注释

49
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 "Iterating over: " . $obj->count() . " values\n";

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

// 这里的好处是可以使用 foreach 循环进行迭代

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

/* 输出类似以下内容 */

Iterating over: 4 values
apple
=yummy
orange
=ah ya, nice
grape
=wow, I love it!
plum=nah, not me

?>

此致。
18
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"));
?>
10
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
1
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';
}

//array(2) {
// [1]=>
// string(2) "ax"
// [2]=>
// &string(2) "bx"
//}
//object(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';
}

//数组(2) {
// [1]=>
// 字符串(2) "ax"
// [2]=>
// 字符串(2) "bx"
//}
var_dump($array1);

//数组(2) {
// [1]=>
// 字符串(1) "a"
// [2]=>
// 字符串(1) "b"
//}
//对象(ArrayIterator)#1 (1) {
// ["storage":"ArrayIterator":private]=>
// 数组(2) {
// [1]=>
// 字符串(2) "ax"
// [2]=>
// 字符串(2) "bx"
// }
//}
var_dump($array2);
var_dump($iterator2);

//数组(2) {
// [1]=>
// 字符串(1) "a"
// [2]=>
// 字符串(1) "b"
//}
//对象(ArrayObject)#2 (1) {
// ["storage":"ArrayObject":private]=>
// 数组(2) {
// [1]=>
// 字符串(2) "ax"
// [2]=>
// 字符串(2) "bx"
// }
//}
var_dump($array3);
var_dump($iterator3);
?>
To Top