2010-09-28 1 views
4

Я повторяю многомерный массив с RecursiveIteratorIterator и хотел бы знать, является ли текущий элемент последним его дочерним слоем. Я подумал об этом:RecursiveIteratorIterator последний ребенок

$iterator = new RecursiveIteratorIterator($array, 
    RecursiveIteratorIterator::SELF_FIRST);  
foreach ($iterator as $val) { 
    $next = clone $iterator; 
    $next->next(); 
    $lastChild = ($next->getDepth() < $iterator->getDepth()); 
} 

Но рекурсивный Истребитель Истер говорит, что он не является клонированным.

+2

@Bobby: Почему УЗД тег бессмысленно? Это, безусловно, вопрос. –

+0

@Dennis Haarbrink: Есть только 42 вопроса на SO с тегом '[SPL]', поэтому я не уверен, добавляет ли он что-то ценное к вопросу. Я также не уверен, что это не будет синонимом самого '[php]', так как я также не помещаю вопросы C# с помощью '[mscoree]' или '[System-Data]'. Но это может стоить дискуссии о Мета. – Bobby

+0

Я отметил «php loops iterator last-child», не понимаю ваших комментариев. – sod

ответ

11

Фраза «последний ребенок ее глубины» не особо понятна. Не могли бы вы подробно рассказать о том, что вы имеете в виду; предполагаемое использование для этого?

Если вы имеете в виду, что глубина изменится после текущего элемента, то (Recursive)CachingIterator имеет удобный метод hasNext, чтобы определить, имеет ли итератор какие-либо дополнительные элементы. Чтобы дать разбавленную пример, аналогичный тому, что в этом вопросе:

$array = array(
    range(1,6), 
    range(7,8), 
    'foo' => range(1,3), 
    'bar' => range(4,5), 
); 

$rit = new RecursiveArrayIterator($array); 
$iterator = new RecursiveIteratorIterator(
    new RecursiveCachingIterator($rit), 
    RecursiveIteratorIterator::LEAVES_ONLY 
); 
foreach ($iterator as $val) { 
    $lastChild = !$iterator->hasNext(); 
    if ($lastChild) { 
     echo "$val is the last child!\n"; 
    } 
} 

Выходы:

6 is the last child! 
8 is the last child! 
3 is the last child! 
5 is the last child! 
+0

О, черт возьми ... там уже есть реализация для этого +1. – VolkerK

+1

+1 приятное использование SPL. –

+2

Мне действительно нужно разобраться с документированием итераторов кеширования. (Любые добровольцы были бы рады.) Я уверен, что отсутствие документов не облегчает вам жизнь, ребята! :) – salathe