RecursiveIteratorIterator::getSubIterator
(PHP 5)
RecursiveIteratorIterator::getSubIterator — The current active sub iterator
Description
Warning
This function is currently not documented; only its argument list is available.
Parameters
-
level
-
Return Values
The current active sub iterator.
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Другие базовые расширения
- Стандартная библиотека PHP (SPL)
- Итераторы
- Функция RecursiveIteratorIterator::beginChildren() - Переход к первому дочернему элементу
- Функция RecursiveIteratorIterator::beginIteration() - Начало навигации
- Функция RecursiveIteratorIterator::callGetChildren() - Получение дочерних элементов
- Функция RecursiveIteratorIterator::callHasChildren() - Проверка, есть ли у элемента дочерние
- Функция RecursiveIteratorIterator::__construct() - Конструктор класса RecursiveIteratorIterator
- Функция RecursiveIteratorIterator::current() - Получает значение текущего элемента
- Функция RecursiveIteratorIterator::endChildren() - End children
- Функция RecursiveIteratorIterator::endIteration() - Окончание навигации
- Функция RecursiveIteratorIterator::getDepth() - Определяет текущую глубину рекурсии
- Функция RecursiveIteratorIterator::getInnerIterator() - Получение ссылки на внутренний итератор
- Функция RecursiveIteratorIterator::getMaxDepth() - Получение максимальной глубины рекурсии
- Функция RecursiveIteratorIterator::getSubIterator() - Получение активного вложенного итератора
- Функция RecursiveIteratorIterator::key() - Получение ключа текущего элемента
- Функция RecursiveIteratorIterator::next() - Перемещение итератора к следующему элементу
- Функция RecursiveIteratorIterator::nextElement() - Следующий элемент
- RecursiveIteratorIterator::rewind
- Функция RecursiveIteratorIterator::setMaxDepth() - Установка максимальной глубины вложенности
- Функция RecursiveIteratorIterator::valid() - Проверка допустимости текущей позиции
Коментарии
Please document this method. I have found a use for it and would love to better understand how it works. TY : )
$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