我有这样的结构
$list = array(
array('code'=>1,'children'=>array(2,3),'name'=>'number one'),
array('code'=>2,'children'=>array(4),'name'=>'number two'),
array('code'=>3,'children'=>array(5,6),'name'=>'number three'),
array('code'=>4,'children'=>array(7),'name'=>'number four'),
array('code'=>5,'children'=>array(),'name'=>'number five'),
array('code'=>6,'children'=>array(8),'name'=>'number six'),
array('code'=>7,'children'=>array(),'name'=>'number seven'),
array('code'=>8,'children'=>array(),'name'=>'number eight')
);
我需要返回
array(
array('code'=>1,'children'=>array(
array('code'=>2,'children'=>array(
array('code'=>4,'children'=>array(7),'name'=>'number four'),
),'name'=>'number two'),
array('code'=>3,'children'=>array(
array('code'=>5,'children'=>array(),'name'=>'number five'),
array('code'=>6,'children'=>array(
array('code'=>8,'children'=>array(),'name'=>'number eight')
),'name'=>'number six'),
),'name'=>'number three'),
),'name'=>'number one')
);
请注意,我没有 parent ID,只有 child ID。并且 id 不是 key (尽管我可以创建一个 foreach 并从中创建一个 key )。关于如何用最少的段落制作它有什么想法吗?
最佳答案
这个怎么样:
//2 pass:
//#1 add keys, objectify
$output = array();
foreach ($list as $k => $el) {
$output[$k + 1] = (object) $el;
}
//#2 build
foreach($output as $k=>$el) {
if (!empty($el->children)) {
$children=$el->children;
$output[$k]->children=array();
foreach($children as $childID) {
$output[$k]->children[]=$output[$childID];
}
} else {
//remove it, no child nodes
unset($output[$k]->children);
}
}
所以,$output[1]
有我们的树,其余的$output
可以丢弃,因为它本质上只是对附加到 1
的节点的额外引用.
$tree=$output[1];
print_r($tree);
stdClass Object
(
[code] => 1
[children] => Array
(
[0] => stdClass Object
(
[code] => 2
[children] => Array
(
[0] => stdClass Object
(
[code] => 4
[children] => Array
(
[0] => stdClass Object
(
[code] => 7
[name] => number seven
)
)
[name] => number four
)
)
[name] => number two
)
[1] => stdClass Object
(
[code] => 3
[children] => Array
(
[0] => stdClass Object
(
[code] => 5
[name] => number five
)
[1] => stdClass Object
(
[code] => 6
[children] => Array
(
[0] => stdClass Object
(
[code] => 8
[name] => number eight
)
)
[name] => number six
)
)
[name] => number three
)
)
[name] => number one
)
我的结构与你的略有不同,因为我使用了对象,对象更适合于此,因为它们是通过引用访问的,这正是你在处理节点时想要的。如果这是 JSON
无论如何它都可能成为一个对象。
关于php - 来自只有 childids 的结构的递归数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30080504/