PHP Conference Kansai 2025

RecursiveIteratorIterator::getSubIterator

(PHP 5, PHP 7, PHP 8)

RecursiveIteratorIterator::getSubIteratorThe current active sub iterator

Опис

public RecursiveIteratorIterator::getSubIterator(?int $level = null): ?RecursiveIterator
Увага

Наразі ця функція не документована. Доступний лише список її параметрів.

Параметри

level

Значення, що повертаються

The current active sub iterator on success; null on failure.

Журнал змін

Версія Опис
8.0.0 level is now nullable.

add a note

User Contributed Notes 2 notes

up
2
lovePhp
6 years ago
Please document this method. I have found a use for it and would love to better understand how it works. TY : )
up
0
2317216477 at qq dot com
1 day ago
$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
To Top