鍍金池/ 問答/PHP  C++/ php無限嵌套的問題

php無限嵌套的問題

請問如何把$a轉(zhuǎn)換成$b?

$a = [
    [
        'id' => 1,
        'pid' => 0,
    ],
    [
        'id' => 2,
        'pid' => 0,
    ], [
        'id' => 3,
        'pid' => 1,
    ], [
        'id' => 4,
        'pid' => 3,
    ], [
        'id' => 5,
        'pid' => 4,
    ],
];

$b = [
    [
        'id' => 1,
        'pid' => 0,
    ],
    [
        'id' => 2,
        'pid' => 0,
    ], [
        'id' => 3,
        'pid' => 1,
        'parents' => [
            [
                'id' => 1,
                'pid' => 0,
            ],
        ],
    ], [
        'id' => 4,
        'pid' => 3,
        'parents' => [
            [
                'id' => 3,
                'pid' => 1,
            ],
            [
                'id' => 1,
                'pid' => 0,
            ],
        ],
    ], [
        'id' => 5,
        'pid' => 4,
        'parents' => [
            [
                'id' => 4,
                'pid' => 3,
            ],
            [
                'id' => 3,
                'pid' => 1,
            ],
            [
                'id' => 1,
                'pid' => 0,
            ],
        ],
    ],
];
回答
編輯回答
紓惘

樹形結(jié)構(gòu),網(wǎng)上有很多參考案例
參考鏈接

2018年2月24日 04:12
編輯回答
菊外人
    //組合多重數(shù)組
    function catePartent($cate, $name = 'parents', $pid = 4)
    {
        
        $arr = array();
        foreach($cate as $v){
            if($pid == $v["id"]){
                $v[$name]=catePartent($cate,$name,$v["pid"]);
                $arr=$v;
            }
        }
    
        return $arr;
    }
    
    //解多重數(shù)組
    function getChilds($cate,$name = 'parents') {
        //print_r($cate);
        $arr = [];
        $p=$cate;
        unset($p[$name]);
        
        if (!empty($cate[$name])) {
            $arr[]= $p;
            $arr= array_merge($arr,getChilds($cate[$name],$name));
        }
        
        if(empty($arr)){
            $arr[] = $p;
        }
        
        return $arr;
    }
    
    
    function get_p($cate)
    {
        $arr=[];
        foreach($cate as $v){
            $tmp=catePartent($cate,$name='parents',$v["pid"]);
            if( empty($tmp)){
                $arr[] = $v;
            }else{
                $v['parents']=$tmp;
                $arr[] = $v;
            }
        }

        $res=[];
        foreach($arr as $v){
            if(isset($v["parents"])){
                $v["parents"] = getChilds($v["parents"]);
            }
            $res[]=$v;
        }
        
        return $res;
    }

$a = [
    ['id' => 1,'pid' => 0,],
    ['id' => 2,'pid' => 0,], 
    ['id' => 3,'pid' => 1,], 
    ['id' => 4,'pid' => 3,], 
    ['id' => 5,'pid' => 4,],
];
var_dump(get_p($a));
2018年4月21日 13:00
編輯回答
詆毀你
$a = [
    [
        'id' => 1,
        'pid' => 0,
    ],
    [
        'id' => 2,
        'pid' => 0,
    ], [
        'id' => 3,
        'pid' => 1,
    ], [
        'id' => 4,
        'pid' => 3,
    ], [
        'id' => 5,
        'pid' => 4,
    ],
];

$b = array();
foreach ( $a as $key => $value) {
    $b[$key] = treeList($a, $value);

}


/**
 * 尋找item的家族樹
 * @param $arr 數(shù)據(jù)源
 * @param $item  要尋找的元素
 * @return mixed
 */
function treeList($arr, $item){
    //如果pid為0是頂級的直接返回
    if($item['pid'] == 0){
        return $item;
    }

    //根據(jù)pid尋找父級元素
    $parent = array();
    foreach ($arr  as $value) {
        if ($item['pid'] == $value['id']) {
            $parent = $value;
        }
    }
    $item['parents'] = treeList($arr, $parent);
    return $item;
}
2018年4月20日 19:40
編輯回答
嘟尛嘴
function getParent($a,$id){
    $c = array();
    $pid = $a[$id-1]['pid'];
    while ($pid!=0){
        $c[] = $a[$pid-1];
        $pid = $a[$pid-1]['pid'];
        
    }
    return $c;
}
$b = array();
foreach ($a as $k=>$value) {
    $b[$k] = $value;
    if($value['pid']!=0){
        $b[$k]['parents'] =  getParent($a,$value['id']);
    }
}
2018年7月1日 07:39
編輯回答
下墜
function getParents($a,$pid){
    $parents=[];
    foreach($a as $v){
        if($v['id']==$pid){
            $parents[]=$v;
            if($v['pid']!=0){
                foreach(getParents($a,$v['pid']) as $vv){
                    $parents[]=$vv;
                }
            }
        }
    }
    return $parents;
}
function getDetail($a){
    $b=[];
    foreach ($a as $k => $v) {
        $b[]=$v;
        if($v['pid']!=0){
            $b[$k]['parents']=getParents($a,$v['pid']);
        }
    }
    return $b;
}
$b=getDetail($a);
2018年6月21日 02:47