ArrayIterator 类

(PHP 5, PHP 7, PHP 8)

介绍

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

当您需要多次遍历同一个数组时,您需要实例化 ArrayObject 并让它创建引用它的 ArrayIterator 实例,这可以通过使用 foreach 或手动调用其 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
15 年前
另一个来自 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
12 年前
需要对迭代值进行回调,但没有 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 迭代器一样使用它。

<?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
1 年前
文档指出“此迭代器允许在迭代数组和对象时取消设置和修改值和键”。但是,如果您将数组传递给构造函数,迭代器将使用该数组的副本进行工作,因此修改不会写回该初始数组。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';
}

//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