RecursiveIteratorIterator::getSubIterator

(PHP 5)

RecursiveIteratorIterator::getSubIteratorThe current active sub iterator

Description

public RecursiveIterator RecursiveIteratorIterator::getSubIterator ([ int $level ] )
Warning

This function is currently not documented; only its argument list is available.

Parameters

level

Return Values

The current active sub iterator.

Коментарии

Автор:
Please document this method. I have found a use for it and would love to better understand how it works. TY : )
2018-12-08 12:52:03
http://php5.kiev.ua/manual/ru/recursiveiteratoriterator.getsubiterator.html
$testArray = [
    'a' => [
        'b' => [
            'c' => 1
        ],
        'd' => [
            'e' => [
                'f' => 2
            ]
        ]
    ]
];

$modes = [
    'LEAVES_ONLY' => \RecursiveIteratorIterator::LEAVES_ONLY,
    'SELF_FIRST' => \RecursiveIteratorIterator::SELF_FIRST,
    'CHILD_FIRST' => \RecursiveIteratorIterator::CHILD_FIRST
];

function logIteratorTraversal(\RecursiveIteratorIterator $iterator, string $modeName)
{
    $maxDepth = 0;
    $log = [];

    foreach ($iterator as $key => $value) {
        $currentDepth = $iterator->getDepth();
        $maxDepth = max($maxDepth, $currentDepth);

        // 构建路径
        $path = [];
        for ($i = 0; $i <= $currentDepth; $i++) {
            $sub = $iterator->getSubIterator($i);
            $path[] = $sub->key();
        }

        $log[] = sprintf(
            "模式: %-11s | 当前深度: %d | 路径: %-16s | 类型: %s",
            $modeName,
            $currentDepth,
            implode('→', $path),
            is_array($value) ? '非叶子节点' : '叶子节点'
        );
    }

    echo "=== {$modeName} 模式遍历日志 ===\n";
    echo implode("\n", $log);
    echo "\n最大实际深度:" . ($maxDepth + 1) . "\n\n";
}

foreach ($modes as $name => $mode) {
    $iterator = new \RecursiveIteratorIterator(
        new \RecursiveArrayIterator($testArray),
        $mode,
        \RecursiveIteratorIterator::CATCH_GET_CHILD
    );
    logIteratorTraversal($iterator, $name);
}

=== LEAVES_ONLY 模式遍历日志 ===
模式: LEAVES_ONLY | 当前深度: 2 | 路径: a→b→c        | 类型: 叶子节点
模式: LEAVES_ONLY | 当前深度: 3 | 路径: a→d→e→f    | 类型: 叶子节点
最大实际深度:4

=== SELF_FIRST 模式遍历日志 ===
模式: SELF_FIRST  | 当前深度: 0 | 路径: a                | 类型: 非叶子节点
模式: SELF_FIRST  | 当前深度: 1 | 路径: a→b            | 类型: 非叶子节点
模式: SELF_FIRST  | 当前深度: 2 | 路径: a→b→c        | 类型: 叶子节点
模式: SELF_FIRST  | 当前深度: 1 | 路径: a→d            | 类型: 非叶子节点
模式: SELF_FIRST  | 当前深度: 2 | 路径: a→d→e        | 类型: 非叶子节点
模式: SELF_FIRST  | 当前深度: 3 | 路径: a→d→e→f    | 类型: 叶子节点
最大实际深度:4

=== CHILD_FIRST 模式遍历日志 ===
模式: CHILD_FIRST | 当前深度: 2 | 路径: a→b→c        | 类型: 叶子节点
模式: CHILD_FIRST | 当前深度: 1 | 路径: a→b            | 类型: 非叶子节点
模式: CHILD_FIRST | 当前深度: 3 | 路径: a→d→e→f    | 类型: 叶子节点
模式: CHILD_FIRST | 当前深度: 2 | 路径: a→d→e        | 类型: 非叶子节点
模式: CHILD_FIRST | 当前深度: 1 | 路径: a→d            | 类型: 非叶子节点
模式: CHILD_FIRST | 当前深度: 0 | 路径: a                | 类型: 非叶子节点
最大实际深度:4
2025-05-13 10:02:55
http://php5.kiev.ua/manual/ru/recursiveiteratoriterator.getsubiterator.html

    Поддержать сайт на родительском проекте КГБ