PHP反向递归

发布于 2022-09-01 22:09:01 字数 398 浏览 10 评论 0

需求是这样的,原数组如下,通过chrome配合phpview的插件截图(二维数组)
图片描述

经过“反向递归后”需要展现成如下树状结构。
其中parent_id是level为上一级的id(最顶级的level为0),比如parent_id=125的用户level为1,那么他的上一级的id是125,先谢过了
图片描述

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

辞别 2022-09-08 22:09:01

不好意思,回答晚了,做了个稍微复杂点的,用了一个内部排序:

// $formated_arr 是你的输入对象
// 首先按照level做一次排序
usort($formated_arr, function($a, $b) {
    $al = intval($a['level']);
    $bl = intval($b['level']);
    return ($al > $bl) ? 1 : -1;
});

// 因为上面做过排序了,所以这里虽然是递归,但对数组只遍历了一次
function reformat_tree(&$arrTmp, $parent_id=0) {
    $ret = null;
    foreach ($arrTmp as $k => $v) {
        if($v['parent_id'] == $parent_id) {
            $ret[$v['id']] = $v;
            unset($arrTmp[$k]);
            $child = reformat_tree($arrTmp, $v['id']);
            !is_null($child) ? $ret[$v['id']]['child'] = $child : 1;
        }
    }
    return $ret;
}

echo(json_encode(reformat_tree($formated_arr)));
掐死时间 2022-09-08 22:09:01

试试我这个:

function createMenuTree($data = array(), $pid = 0){
    if (empty($data)){
        return array();
    }
     static $level = 1;
     $returnArray = array();
    foreach ($data as $node){
        if ($node['parent_id'] == $pid){
            $returnArray[] = array(
                'cat_id'   => $node['cat_id'],
                'cat_name' => $node['cat_name'],
                'level' => $level,
                'parent_id' => $node['parent_id'],
                'show_in_nav' => $node['show_in_nav'],
                'is_show' => $node['is_show'],
                'sort_order' => $node['sort_order']
                );
            if (hasChild($node['cat_id'], $data)){
               $level++;
               $returnArray = array_merge($returnArray, createMenuTree($data, $node['cat_id']));
               $level--;
            }
        }
    }
     return $returnArray;
}

function hasChild($cid, $data){
    $hasChild = false;
    foreach ($data as $node){
        if ($node['parent_id'] == $cid){
            $hasChild = true;
            break;
        }
    }
    return $hasChild;
}
 

字段跟你的不是很一样,但是思路好像跟你想要的差不多,你可以自己拿去修改一下。

救星 2022-09-08 22:09:01
function recursive_tree($arr,$level = 0,$parent_id = 0){
    $tmp = array();       
    foreach ($arr as $key => $value) {
        if($value['level'] == $level && $value['parent_id'] == $parent_id){
            $arr[$key]['child'] = recursive_tree($arr,$value['level'] + 1,$value['id']);
            if(empty($arr[$key]['child'])){
                unset($arr[$key]['child']);
            }
            $tmp[] = $arr[$key];
        }
    }
    return $tmp;
}


$arr = array(
    array(
        'id'     => '125',
        'level' => '0',
        'user_id' => '1021',
        'parent_id' => '0', 
    ),
    array(
        'id'     => '189',
        'level' => '1',
        'user_id' => '1022',
        'parent_id' => '125', 
    ),
    array(
        'id'     => '425',
        'level' => '2',
        'user_id' => '4119',
        'parent_id' => '189', 
    ),
    array(
        'id'     => '385',
        'level' => '3',
        'user_id' => '3170',
        'parent_id' => '425', 
    ),
    array(
        'id'     => '782',
        'level' => '3',
        'user_id' => '5698',
        'parent_id' => '425', 
    ),
    array(
        'id'     => '688',
        'level' => '1',
        'user_id' => '7045',
        'parent_id' => '125', 
    )
);

echo json_encode(recursive_tree($arr,0,0));die;
随风而去 2022-09-08 22:09:01

http://segmentfault.com/q/1010000004052822/a-1020000004055246

参照我在这个问题下的回答的前半部分,详细解释了题主的问题所需要的那个并不复杂的算法,只是题目从OC变成了PHP。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文