PHP反向遞迴

來源:互聯網
上載者:User

需求是這樣的,原數組如下,通過chrome配合phpview的外掛程式(二維數組)

經過“反向遞迴後”需要展現成如下樹狀結構。
其中parent_id是level為上一級的id(最頂級的level為0),比如parent_id=125的使用者level為1,那麼他的上一級的id是125,先謝過了

回複內容:

需求是這樣的,原數組如下,通過chrome配合phpview的外掛程式(二維數組)

經過“反向遞迴後”需要展現成如下樹狀結構。
其中parent_id是level為上一級的id(最頂級的level為0),比如parent_id=125的使用者level為1,那麼他的上一級的id是125,先謝過了

不好意思,回答晚了,做了個稍微複雜點的,用了一個內部排序:

// $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。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.