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
12 年前
如果您正在迭代一个多维对象数组,您可能会倾向于在 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>';
}

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

//-------------
//Recursive...

$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>';
}

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

?>
To Top