Я расширил Zend_View_Helper_Navigation_Menu
, и он использует RecursiveIteratorIterator
для итерации по дереву меню. То, что я хочу, чтобы определить, является ли я на первом или последнем элементе для уровня ветки в дереве.PHP RecursiveIteratorIterator: определение первого и последнего элемента на каждом уровне филиала
Вот пример того, что я ищу:
- Nav 1 (первый)
- Nav 1.1 (первый & последний)
- Nav 1.1.1 (первый)
- Nav 1.1.2
- Nav 1.1.3 (последний)
- Nav 1.1 (первый & последний)
- нав 2
- Нав 2.1 (первый)
- Нав 2.2 (последний)
- Нав 3 (последний)
- Нав 3.1 (первый)
- Нав 3.2 (последний)
Дополнительная информация
- PHP Version 5.2.13
Решение
В цикле foreach ($iterator as $page)
две переменные могут быть использованы для отслеживания из глубины, $depth
и $prevDepth
. Простой пример сравнения может затем определить первый элемент на уровне филиала: if ($depth > $prevDepth)
.
Создание RecursiveCachingIterator
с помощью Zend_Navigation_Container
объекта, а затем с помощью, чтобы создать RecursiveIteratorIterator
добавляет метод hasNext()
.
$rci = new RecursiveCachingIterator($container, CachingIterator::FULL_CACHE);
$iterator = new RecursiveIteratorIterator($rci,
RecursiveIteratorIterator::SELF_FIRST);
/* snip */
$prevDepth = -1;
foreach ($iterator as $page) {
$depth = $iterator->getDepth();
/* snip */
if ($depth > $prevDepth) {
// first branch item
}
/* snip */
if (!$iterator->hasNext()) {
// last branch item
}
/* snip */
$prevDepth = $depth;
}
Должно быть возможно каким-то образом использовать `getChildren` или` nextElement` ... Но, к сожалению, эти классы еще мало документированы http://www.php.net/manual/en/class.recursiveiteratoriterator.php – 2010-12-03 17:29:36
Что mode - это `RecursiveIteratorIterator`, работающий с (это второй параметр для конструктора)? `LEAVES_ONLY`,` CHILD_FIRST` или `SELF_FIRST` (` LEAVES_ONLY` является значением по умолчанию)? – ircmaxell 2010-12-03 17:41:24