时间:2021-07-01 10:21:17 帮助过:7人阅读
我想要这种效果,用迭代的方式
我现在是这种效果,如何让取出来的数组具有层级?
目前的代码,如何修改?或者给个思路也行
//迭代调用子孙树
function node_merge($node,$access,$parent = 0){
$task = array($parent) ; //任务表
$arr = array(); //返回数据
while (!empty($task)) {
$flag = false; //声明标识符
foreach ($node as $k=> $v) {
if($v['pid'] == $parent){
if (isset($node[$parent])) {
$arr[] = $v;
}
// $arr[] = $v; //将找到的栏目存进$arr,等待返回
array_push($task, $v['id']);//将最新的地区存入任务栈,只要task还有任务,循环会继续.
$parent = $v['id'];//将当前id存入$parent
unset($node[$k]); //把找到的单元unset掉
$flag = true; //说明找到了子栏目
}
}
//如果flsg为false,就代表找不到已找不到子栏目了,可以将最后的单元pop掉然后继续循环了.
if ($flag == false) {
array_pop($task); //弹出任务表
$parent = end($task); //把找到的单元unset掉
}
}
return $arr;
}
我想要这种效果,用迭代的方式
我现在是这种效果,如何让取出来的数组具有层级?
目前的代码,如何修改?或者给个思路也行
//迭代调用子孙树
function node_merge($node,$access,$parent = 0){
$task = array($parent) ; //任务表
$arr = array(); //返回数据
while (!empty($task)) {
$flag = false; //声明标识符
foreach ($node as $k=> $v) {
if($v['pid'] == $parent){
if (isset($node[$parent])) {
$arr[] = $v;
}
// $arr[] = $v; //将找到的栏目存进$arr,等待返回
array_push($task, $v['id']);//将最新的地区存入任务栈,只要task还有任务,循环会继续.
$parent = $v['id'];//将当前id存入$parent
unset($node[$k]); //把找到的单元unset掉
$flag = true; //说明找到了子栏目
}
}
//如果flsg为false,就代表找不到已找不到子栏目了,可以将最后的单元pop掉然后继续循环了.
if ($flag == false) {
array_pop($task); //弹出任务表
$parent = end($task); //把找到的单元unset掉
}
}
return $arr;
}
應該是不用這麼複雜~
用遞歸可以很簡單達成這樣任務:
遞歸
function parseTree($tree, $root = null) {
$nested = array();
foreach($tree as $index => $child) {
if($child['pid'] == $root) {
unset($tree[$index]);
$child['children'] = parseTree($tree, $child['id']);
$nested[] = $child;
}
}
return empty($nested) ? null : $nested;
}
迭代
function parseTree($rows) {
$rows = array_column ( $rows, null, 'id' );
foreach ( $rows as $key => $val ) {
if ( $val ['pid'] ) {
if ( isset ( $rows [$val ['pid']] )) {
$rows [$val ['pid']]['children'][] = &$rows [$key];
}
}
}
foreach ( $rows as $key => $val ) {
if ( $val ['pid'] ) unset ( $rows [$key] );
}
return $rows;
}