1

こんにちは私はいくつかのイテレータのアドバイスが必要です。

アイテムのコレクションを含めることができ、子カテゴリも含めることができるCategoryオブジェクトがあります。

doctrine ORMから、カテゴリオブジェクトのコレクションを取得します。次に、このコレクションをトラバースして、カテゴリツリー構造をフラット化します。したがって、子カテゴリは親と同じレベルにあります。また、子供たちをフィルタリングしたいと思います。

たぶん誰かが私を正しい方向に向けることができますが、現在Iteratorクラウドで少し失われています。

<?php

class Category
{
    private $name;

    private $children;

    private $type;

    private $parent;

    private $items;

    //parent category
    public function getParent()
    {
        return $this->parent;
    }

    public function setItems($items)
    {
        $this->items = $items;
    }


    public function getItems()
    {
        return $this->items;
    }

    //colelction of categories
    public function getChildren()
    {
        return $this->children;
    }
}
4

2 に答える 2

4

単にRecursiveIteratorインターフェースを実装する必要があります。次に、具象RecursiveIteratorIteratorを使用して反復処理できます。

あなたが理解するのを助けるために...

ARecursiveIteratorは、それ自体では「再帰的」ではありません。これは、子を取得するために使用できる特定の方法を提供するものにすぎません(再帰のサブ問題は「子」と考えることができます)。RecursiveIterator.getChildren()は、その子を別のの形式で返す必要があることに注意してくださいRecursiveIterator

プレーンを手動で反復することもできますがRecursiveIterator、への再帰呼び出しによって返されるすべてのサブイテレータを追跡しgetChildren、適切な深さなどを維持するのはかなり面倒RecursiveIteratorIteratorです...

ARecursiveIteratorIteratorは、再帰を模倣して、構造を体系的にトラバースするための実際の作業を行うものです。フラットリストであるかのように繰り返しますRecursiveIteratorが、リスト内の各要素で、現在の要素の子の存在をテストします。の場合hasChildren、この新しい子イテレータへの参照を呼び出しgetChildrenてスタックに格納します。期待する再帰的動作を提供する方法でスタックを管理します(再帰関数を手動で反復バージョンに変換するのとほぼ同じ方法です)。

明確にするために、独自RecursiveIteratorIteratorにコーディングするのではなく、phpの具体的な実装をインスタンス化するだけです。このクラスは、複雑さを隠し、RecursiveIteratorトラバーサルプロセスでインスタンス化される多くのオブジェクトをすべて管理し、トラバーサルの結果をフラットリストのように表示するためだけに存在します。RecursiveIteratorIterator内部的には非常に複雑なクラスです。

フィルタリングに関して-

いくつかの方法があります。使いやすさのために、 php 5.4を使用している場合は、CallbackFilterIteratorを使用することをお勧めします。それ以外の場合は、 FilterIteratorを拡張する必要があります。

ただし、これらは両方とも、再帰構造のビューがフラット化されて構造のようなリストになった後、要素をフィルターで除外します。したがって、フィルタは、たとえば「このサブツリー全体をスキップする」とは言えず、「この単一の要素をスキップする」としか言えません。「このサブツリー全体をスキップする」と言う必要がある場合は、RecursiveCallbackFilterIteratorを使用するか、php5.4がない場合はRecursiveFilterIteratorを拡張する必要があります。

あなたはおそらくから始めたいでしょう

class RecursiveCategoryIterator implements RecursiveIterator {...

そして、それにはカテゴリオブジェクトのリストが含まれているはずです。

于 2012-06-08T21:32:26.177 に答える
0

ルートノードから開始し、それぞれ(ノードとサブノード(およびそれらのサブノード(およびそれらのサブノード(およびそれらのサブノード))))(再帰)を再帰的にトラバースする必要があります。これにより、次のようになります。$this->getChildren()null

(Start)
Root node
-> 1st Child node
--> Grandchild node
-> 2nd Child node
-> 3rd Child node
-> 4th Child node
--> Grandhild node
(No more children so exit)
于 2012-06-08T20:21:49.347 に答える