我有一个典型的嵌套树模型,我想根据级别或深度构建一个带有'children'数组的数组,但它似乎对我不起作用。这就是我现在所拥有的:
while($this->tax->getTreeNext($nodes))
{
$level = $this->tax->getTreeLevel($nodes);
if($level != 0){
echo $level . '-' . $current_level;
if($level > $current_level){
$terms[$i] = array(
'term_id' => $terms[$i-1]['term_id'],
'name' => $terms[$i-1]['name'],
'level' => $terms[$i-1]['level'],
'children' => array(
'term_id' => $nodes['row']['term_id'],
'name' => $nodes['row']['name'],
'level' => $level,
)
);
unset($terms[$i-1]);
}else{
$terms[$i] = array(
'term_id' => $nodes['row']['term_id'],
'name' => $nodes['row']['name'],
'level' => $level
);
}
$current_level = $level;
$i++;
}
}
这适用于单个孩子,但如果孩子有孩子则不行......有任何建议如何解决这个问题吗?
谢谢!
编辑:
这是最近似乎接近工作的最新消息:
function process(&$arr, &$prev_sub = null, $cur_depth = 1) {
$cur_sub = array();
while($line = current($arr)){
if($line['depth'] < $cur_depth){
return $cur_sub;
}elseif($line['depth'] > $cur_depth){
$prev_sub = $this->process($arr, $cur_sub, $cur_depth + 1 );
}else{
$cur_sub[$line['term_id']] = array('term_id' => $line['term_id'], 'name' => $line['name']);
$prev_sub =& $cur_sub[$line['term_id']];
next($arr);
}
}
return $cur_sub;
}
使用与每个节点关联的深度值将树传递给此树。目前的问题在于elseif($line['depth'] > $cur_depth)
。如果节点有子节点,它只返回子节点的数组,但不包括节点名称或term_id。
谢谢!
答案 0 :(得分:1)
由于我并没有真正了解当前数据结构的样子,请查看遍历树的这个简单示例。
$treeRoot = $this->tax->getRoot();
$result = traverse($treeRoot, 0);
function traverse($root, $level){
$arr = array();
$arr['term_id'] = $root['row']['term_id'];
$arr['name'] = $root['row']['name'];
$arr['level'] = $level;
while($child = $root->getNextChild()){
$arr['children'][] = traverse($child, $level+1);
}
return $arr;
}
所以你从树根开始,填充第一级数组。然后你继续root的孩子,但你更深一层。你完成与root完全相同的事情,你填写数据并转到孩子的孩子。当你到达树的底部时,最后一个(grandgrandgrand)孩子发现它没有剩下的孩子,所以它只是将自己(正常数组)返回给它的父。那个父母将自己返回给它的父母,依此类推,直到你再次到达根。
瞧,你有自己的嵌套阵列。通常,您将这种结构保留为树,但由于我不知道您希望结果到底是什么(您没有提供示例),请使用上面的代码作为您自己实现的参考。