略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: RecursiveArrayIterator

2024-04-27

The RecursiveArrayIterator class

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

简介

This iterator allows to unset and modify values and keys while iterating over Arrays and Objects in the same way as the ArrayIterator. Additionally it is possible to iterate over the current iterator entry.

类摘要

class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator {
/* 继承的常量 */
const int STD_PROP_LIST = 1;
const int ARRAY_AS_PROPS = 2;
/* 常量 */
const int CHILD_ARRAYS_ONLY = 4;
/* 方法 */
public hasChildren(): bool
/* 继承的方法 */
public ArrayIterator::append(mixed $value): void
public ArrayIterator::asort(int $flags = SORT_REGULAR): bool
public ArrayIterator::count(): int
public ArrayIterator::key(): string|int|null
public ArrayIterator::ksort(int $flags = SORT_REGULAR): bool
public ArrayIterator::natsort(): bool
public ArrayIterator::next(): void
public ArrayIterator::offsetSet(mixed $key, mixed $value): void
public ArrayIterator::rewind(): void
public ArrayIterator::seek(int $offset): void
public ArrayIterator::serialize(): string
public ArrayIterator::setFlags(int $flags): void
public ArrayIterator::uasort(callable $callback): bool
public ArrayIterator::uksort(callable $callback): bool
public ArrayIterator::unserialize(string $data): void
public ArrayIterator::valid(): bool
}

预定义常量

RecursiveArrayIterator Flags

RecursiveArrayIterator::CHILD_ARRAYS_ONLY

Treat only arrays (not objects) as having children for recursive iteration.

目录

add a noteadd a note

User Contributed Notes 4 notes

up
17
c dot 1 at smithies dot org
10 years ago
If you are iterating over a multi-dimensional array of objects, you may be tempted to use a RecursiveArrayIterator within a RecursiveIteratorIterator. You are likely to get baffling results if you do. That is because RecursiveArrayIterator treats all objects as having children, and tries to recurse into them. But if you are interested in having your RecursiveIteratorIterator return the objects in your multi-dimensional array, then you don't want the default setting LEAVES_ONLY, because no object can be a leaf (= has no children).

The solution is to extend the RecursiveArrayIterator class and override the hasChildren method appropriately. Something like the following might be suitable:

<?php
class RecursiveArrayOnlyIterator extends RecursiveArrayIterator {
  public function
hasChildren() {
    return
is_array($this->current());
  }
}
?>
Of course, this simple example will not recurse into ArrayObjects either!
up
15
mccarthy dot richard at gmail dot com
11 years ago
Using the RecursiveArrayIterator to traverse an unknown amount of sub arrays within the outer array. Note: This functionality is already provided by using the RecursiveIteratorIterator but is useful in understanding how to use the iterator when using for the first time as all the terminology does get rather confusing at first sight of 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();
    }
}
?>

The output from which is:
0 : a
0 : subA
1 : subB
0 : subsubA
1 : subsubB
0 : deepA
1 : deepB
2 : b
0 : subA
1 : subB
2 : subC
4 : c
up
8
lemoinem dot remove at me dot mlemoine dot name
8 years ago
The RecursiveArrayOnlyIterator behaviour c dot 1 at smithies dot org presented can also be achieved using the (undocumented) flag RecursiveArrayIterator::CHILD_ARRAYS_ONLY (https://github.com/php/php-src/blob/master/ext/spl/spl_array.c#L1970 and https://github.com/php/php-src/blob/master/ext/spl/spl_array.c#L1620)
up
1
Edgar
1 month ago
<?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
*/

?>

官方地址:https://www.php.net/manual/en/class.recursivearrayiterator.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3