3

ツリー構造をキャッシュして、後でアクセスする必要があります。問題:データを宣言して、それに適合するようにする方法を本当に理解できませんRecursiveIteratorIterator。おそらく非常にn00bishの質問ですが、多くの組み合わせを試し、アイデアが不足しました:-(

概念的には、データは次のようになります。

ROOT code : 1111, label : Universe
   - code : 2000, label : Asia
      - code : 3203, label : Hongkong
           -code : 2081, label: Greater Area
           -code : 2041, label: Downtown
      - code : 4020, label : Shanghai
   - code : 6201, label : Africa
   - code : 321, label : North America

たとえば、アジア香港や上海など、特定のコードに直接アクセスするすべての子にアクセスしたいと思います。 RecursiveIteratorIteratorこれを簡単にするようです。

// looking for Asia with code = 2000
$iterator = new RecursiveIteratorIterator(new Universe_Tree($tree));
foreach ($iterator as $key => $item) {
       if ($item->code == 2000) {
            var_dump($iterator->callGetChildren());

       }
}

クラスUniverse_Treeはまだ多くのことをしていません:

class Universe_Tree extends ArrayIterator implements RecursiveIterator  {

    public function hasChildren() {
        return (is_array($this->current()));
    }

    public function getChildren() {
        return new self($this->current());
    }

}

私の最善のアプローチは、各ノードのオブジェクトを作成し、それらをネストされた配列に格納することでした

$universe = new stdClass();
$universe ->code = 1111;
$universe ->label = "Universe"; 

$tree = array(
  array($universe,
    array(
       $asia,
      (array($shanghai,$hongkong)),
       $europe
        // and so on
       )
      );

残念ながら$iterator->callGetChildren()、子は返されません。現在の要素だけが返されます。おそらく、ノードが正しくネストされていないためです。また、parentIdを使用して配列をネストしようとしましたが、これによりArrayIterator、これは配列またはオブジェクトではないというエラーメッセージが表示されますvar_dumpが、それは配列でした。他に何を試すことができますか?

4

1 に答える 1

0

これは一種の答えです。実際、私はあきらめて、SimpleXMLに基づくソリューションに行きました。本当にシンプルでコードはほとんどありません。最終的に誰かがこの質問に出くわし、私の「解決策」も彼のための方法かもしれません。だから私はそれをここに含めます:

// data represented as xml
$xmlstring = <<<XML
<orgtree>
  <level number="1">
        <unit label="Universe" code="1111">
            <level number="2">
                <unit label="Asia" code="2000"></unit>
                    <level number="3">
                        <unit label="Hongkong" code="3203"></unit>
                           <level number="4">
                               <unit label="Greater Area" code="2081"></unit>
                               <unit label="Downtown" code="2041"></unit>
                           </level>
                    </level>
                </unit>
            <unit label="Africa" code="6201"></unit>
            <unit label="North America" code="321"></unit>
            </level>
        </unit>
    </level>
</orgtree>
XML;


   $xml = simplexml_load_string($xmlstring);
   // use xpath to select part of xml
   foreach ($xml->xpath('//unit[@code="2000"]') as $parentUnit)
   {
        $subtree = $parentUnit->level;
        foreach ($subtree->unit as $unit) {
                 var_dump($unit["label"]);
        }
   }
于 2012-12-16T17:03:59.720 に答える