我需要缓存一棵树状结构并在以后访问它。问题是:我真的不知道如何声明数据,使其适合于
从概念上来看,数据长这样:
RecursiveIteratorIterator
等。这可能是一个非常新手的问题,但我已经尝试了很多组合,想不出更好的办法 :-(从概念上来看,数据长这样:
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
,它确实是一个数组。我还能尝试什么?
ArrayObject
(或实际数组)而不是stdClass
可能会更有帮助;(2)默认情况下,RecursiveIteratorIterator
是LEAVES_ONLY
,只显示标量。将RecursiveIteratorIterator::SELF_FIRST
或RecursiveIteratorIterator::CHILD_FIRST
作为第二个参数传递给RecursiveIteratorIterator
。 - Wrikken