ツリー構造をキャッシュして、後でアクセスする必要があります。問題:データを宣言して、それに適合するようにする方法を本当に理解できません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
が、それは配列でした。他に何を試すことができますか?