2010-09-28 91 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()); 
} 

但RecursiveIteratorIterator說它不可複製。

+2

@Bobby:爲什麼SPL標籤意義?這絕對是一個問題。 – 2010-09-28 09:55:49

+0

@Dennis Haarbrink:SO標籤上只有42個問題,因此我不確定它是否爲這個問題增加了一些有價值的東西。我也不確定這是否不會與'[php]'本身同義,因爲我也沒有用'[mscoree]'或'[System-Data]'標記C#問題。但是這可能值得Meta的討論。 – Bobby 2010-09-28 10:01:55

+0

我標記爲「PHP循環迭代最後孩子」,不明白你的意見。 – sod 2010-09-28 10:10:34

回答

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 2010-09-28 11:47:20

+1

+1好用的SPL。 – 2010-09-28 11:55:14

+2

我應該真正瞭解如何記錄緩存迭代器。 (任何志願者都會受到歡迎。)我相信,缺乏文檔並不會讓你們的生活更輕鬆! :) – salathe 2010-09-28 11:56:54

相關問題