Я расширил Zend_View_Helper_Navigation_Menu
, и он использует RecursiveIteratorIterator
для перебора дерева меню. Я хочу определить, нахожусь ли я на первом или последнем элементе уровня ветви в дереве.
Вот пример того, что я ищу:
- Nav 1 (первый)
- Nav 1.1 (первый и последний)
- Nav 1.1.1 (первая)
- Nav 1.1.2
- Nav 1.1.3 (последняя)
- Nav 2
- Nav 2.1 (первый)
- Nav 2.2 (последний)
- Nav 3 (последний)
- Nav 3.1 (первый)
- Nav 3.2 (последняя)
Дополнительная информация
Решение
В цикле 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;
}