PHP Conference Japan 2024

RecursiveArrayIterator 类

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

简介

此迭代器允许在迭代数组和对象时取消设置和修改值和键,方式与ArrayIterator相同。此外,还可以迭代当前迭代器条目。

类概要

class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator {
/* 继承的常量 */
/* 常量 */
public const int CHILD_ARRAYS_ONLY;
/* 方法 */
public hasChildren(): bool
/* 继承的方法 */
public ArrayIterator::__construct(array|object $array = [], int $flags = 0)
public ArrayIterator::seek(int $offset): void
}

预定义常量

RecursiveArrayIterator标志

RecursiveArrayIterator::CHILD_ARRAYS_ONLY

仅将数组(而非对象)视为具有用于递归迭代的子项。

目录

添加注释

用户贡献的注释 4 条注释

c dot 1 at smithies dot org
13 年前
如果您正在迭代一个多维对象数组,您可能会倾向于在 RecursiveIteratorIterator 中使用 RecursiveArrayIterator。如果您这样做,很可能会得到令人费解的结果。这是因为 RecursiveArrayIterator 将所有对象都视为具有子项,并尝试递归进入它们。但是,如果您希望您的 RecursiveIteratorIterator 返回多维数组中的对象,那么您不需要默认设置 LEAVES_ONLY,因为没有任何对象可以是叶子(= 没有子项)。

解决方案是扩展 RecursiveArrayIterator 类并适当地重写 hasChildren 方法。类似下面的代码可能适用:

<?php
class RecursiveArrayOnlyIterator extends RecursiveArrayIterator {
public function
hasChildren() {
return
is_array($this->current());
}
}
?>
当然,这个简单的例子也不会递归进入 ArrayObjects!
mccarthy dot richard at gmail dot com
13 年前
使用 RecursiveArrayIterator 遍历外层数组中未知数量的子数组。注意:使用 RecursiveIteratorIterator 已经提供了此功能,但在第一次使用迭代器时,了解如何使用迭代器非常有用,因为乍一看 SPL 中的所有术语都相当令人困惑!

<?php
$myArray
= array(
0 => 'a',
1 => array('subA','subB',array(0 => 'subsubA', 1 => 'subsubB', 2 => array(0 => 'deepA', 1 => 'deepB'))),
2 => 'b',
3 => array('subA','subB','subC'),
4 => 'c'
);

$iterator = new RecursiveArrayIterator($myArray);
iterator_apply($iterator, 'traverseStructure', array($iterator));

function
traverseStructure($iterator) {

while (
$iterator -> valid() ) {

if (
$iterator -> hasChildren() ) {

traverseStructure($iterator -> getChildren());

}
else {
echo
$iterator -> key() . ' : ' . $iterator -> current() .PHP_EOL;
}

$iterator -> next();
}
}
?>

输出结果为:
0 : a
0 : subA
1 : subB
0 : subsubA
1 : subsubB
0 : deepA
1 : deepB
2 : b
0 : subA
1 : subB
2 : subC
4 : c
lemoinem dot remove at me dot mlemoine dot name
10年前
c dot 1 at smithies dot org 提出的 RecursiveArrayOnlyIterator 行为也可以使用(未记录的)标志 RecursiveArrayIterator::CHILD_ARRAYS_ONLY 来实现(https://github.com/php/php-src/blob/master/ext/spl/spl_array.c#L1970https://github.com/php/php-src/blob/master/ext/spl/spl_array.c#L1620
Edgar
2年前
<?php
$array
= [
'A','B',
'C'=>[
'D','E',
'F'=>['G','H']
],
'I','J'
];

$iterator = new RecursiveArrayIterator($array);

foreach(
$iterator as $key=>$value)
{
echo
$key,':', $value,'<br>';
}

/**
输出
0:A
1:B
C:Array
2:I
3:J
*/

//-------------
//递归...

$array = [
'A','B',
'C'=>[
'D','E',
'F'=>['G','H']
],
'I','J'
];

$it = new RecursiveArrayIterator($array);
$iterator = new RecursiveIteratorIterator($it);

foreach(
$iterator as $key=>$value)
{
echo
$key,':', $value,'<br>';
}

/**
输出
0:A
1:B
0:D
1:E
0:G
1:H
2:I
3:J
*/

?>
To Top