欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP反向递归

程序员文章站 2022-05-07 20:50:38
...

需求是这样的,原数组如下,通过chrome配合phpview的插件截图(二维数组)
PHP反向递归

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

回复内容:

需求是这样的,原数组如下,通过chrome配合phpview的插件截图(二维数组)
PHP反向递归

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

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

// $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)));

试试我这个:

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;
}
 

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

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;

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

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

相关标签: php 递归