PHP Conference Kansai 2025

RecursiveIteratorIterator::getSubIterator

(PHP 5, PHP 7, PHP 8)

RecursiveIteratorIterator::getSubIteratorL'itérateur secondaire actif courant

Description

public RecursiveIteratorIterator::getSubIterator(?int $level = null): ?RecursiveIterator
Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

level

Valeurs de retour

L'itérateur secondaire actif courant en cas de succès ou null si une erreur survient.

Historique

Version Description
8.0.0 level est désormais 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