2013-12-20 98 views
0

我即將在PHP 5.4中實現pythons itertools.groupby;因爲我需要它。RecursiveIterator有什麼意義?

它是一個迭代器,它將一個迭代器作爲輸入並返回一系列迭代器,正是它對這個問題不重要。

好像像這樣應該是一個RecursiveIterator;但我不知道該接口的用途是什麼。

爲什麼你不只是返回迭代器直接而不是繞過hasChildren?另一件事;那麼價值應該是什麼?

這可能是我錯了; GroupBy應該是而不是是RecursiveIterator;但這是個問題。什麼 RecursiveIterator的用途/用例?

編輯:這個問題我們不是重複的「RecursiveIteratorIterator如何在PHP中工作?」除了關於數組的問題之外,關於ArrayIterator的深入討論將完全回答。

這個問題是關於RecursiveIterator,爲什麼你使用它,何時適合使用等等。我對使用接口的一些具體類不感興趣。

+0

RecursiveIterator的要點是迭代遞歸結構。 –

+0

@Odalrick請參閱http:// stackoverflow。com/a/12235779/113938 – salathe

+0

@Jack如果我想了解RecursiveIteratorIterator,那麼我會詢問RecursiveIteratorIterator,而不是RecursiveIterator。 – Odalrick

回答

2

迭代器迭代集合。說,鑑於這種結構:

array(
    'foo', 
    'bar', 
    array(
     'baz' 
    ) 
) 

定期Iterator會遍歷這個結構並返回foobarArray。 A RecursiveIterator有方法來發信號嘿,如果你想讓我RecursiveIterator::hasChildrenRecursiveIterator::getChildren)有一個孩子可以迭代。您可以編寫代碼來檢測這些子代的存在並自己獲取子迭代器,或者您可以使用RecursiveIteratorIterator,它可以爲您執行此操作,並讓您像遍歷列表一樣遍歷結構,返回foobarbaz

foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as ...) 

的區別存在,所以你可以:

  • 迭代一個平面列表,或
  • 重複的進行「手動遞歸」平面列表,或
  • 遍歷一個遞歸結構好像它是一個平板清單

我會說RecursiveIterator接口很少直接被「cons umers「,但它是RecursiveIteratorIterator的構建塊,它允許您輕鬆定義自己的迭代器,以便爲自己的遞歸數據結構重複使用RecursiveIteratorIterator。它允許你通過定義兩個方法便宜地實現遞歸:一個檢查一個元素是否可迭代,另一個是爲迭代器返回迭代器。

+0

因此,RecursiveIterator遍歷一棵樹,其中每個節點都有一個值並可能有子節點。密切相關:OuterIterator具有值和子元素。這引出了問題; RecusiveIterator和假設的TreeIterator之間有明顯的區別;或者僅僅是選擇另一個名稱的情況? – Odalrick

+0

不完全。一個'RecursiveIterator'遍歷一個列表,可以選擇獲取子迭代器。 'RecursiveIterarorIterator'循環遍歷RecursiveIterator提供的訪問權限。一個「TreeIterator」可能會將這兩個任務合併到一個類中,而不是將其分解爲兩個。 – deceze