Класс RecursiveArrayIterator

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

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π­Ρ‚ΠΎΡ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ позволяСт ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ значСния ΠΈ ΠΊΠ»ΡŽΡ‡ΠΈ Π²ΠΎ врСмя ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° ΠΏΠΎ массивам ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ ArrayIterator. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ записи ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°.

ΠžΠ±Π·ΠΎΡ€ класса

class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator {
/* НаслСдуСмыС константы */
/* ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ */
public const int CHILD_ARRAYS_ONLY;
/* ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ */
public function hasChildren(): bool
/* НаслСдуСмыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ */
public function ArrayIterator::__construct(array|object $array = [], int $flags = 0)
public function ArrayIterator::append(mixed $value): void
public function ArrayIterator::asort(int $flags = SORT_REGULAR): true
public function ArrayIterator::count(): int
public function ArrayIterator::current(): mixed
public function ArrayIterator::getFlags(): int
public function ArrayIterator::key(): string|int|null
public function ArrayIterator::ksort(int $flags = SORT_REGULAR): true
public function ArrayIterator::natcasesort(): true
public function ArrayIterator::natsort(): true
public function ArrayIterator::next(): void
public function ArrayIterator::offsetExists(mixed $key): bool
public function ArrayIterator::offsetGet(mixed $key): mixed
public function ArrayIterator::offsetSet(mixed $key, mixed $value): void
public function ArrayIterator::offsetUnset(mixed $key): void
public function ArrayIterator::rewind(): void
public function ArrayIterator::seek(int $offset): void
public function ArrayIterator::serialize(): string
public function ArrayIterator::setFlags(int $flags): void
public function ArrayIterator::uasort(callable $callback): true
public function ArrayIterator::uksort(callable $callback): true
public function ArrayIterator::unserialize(string $data): void
public function ArrayIterator::valid(): bool
}

ΠŸΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ константы

Π€Π»Π°Π³ΠΈ RecursiveArrayIterator

RecursiveArrayIterator::CHILD_ARRAYS_ONLY

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ массивам (Π½Π΅ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ) ΠΊΠ°ΠΊ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… Π΄Π΅Ρ‚Π΅ΠΉ для ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

  • RecursiveArrayIterator::getChildren β€” Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта, Ссли этот элСмСнт являСтся массивом (array) ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ (object)
  • RecursiveArrayIterator::hasChildren β€” ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚, являСтся Π»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ элСмСнт массивом ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 4 notes

up
18
c dot 1 at smithies dot org ΒΆ
14 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 ΒΆ
15 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
5
Edgar ΒΆ
4 years 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
*/

?>
up
8
lemoinem dot remove at me dot mlemoine dot name ΒΆ
12 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)