1. 程式人生 > >php遞迴樹的實現

php遞迴樹的實現

使用到了https://github.com/akanehara/ginq,這個類庫可以在php中像.net一樣使用linq

private function gettree(&$list, &$parent=null, &$tree=array())
    {
        $query = Ginq::from($list)->where(function ($m) use ($parent) {
            if (empty($parent)) {
                return  $m['parentId']==null;
            } else {
                return  $m['parentId']==$parent['id'];
            }
        })->toArray();
        
        foreach ($query as $row) {
            $node = array();
            $node['id']=$row['id'];
            $node['text']=$row['name'];
            $node['checked']=false;
            $node['children']=array();

            $v = Ginq::from($list)->count(function ($m) use ($row) {
                return $m['parentId']==$row['id'];
            });
            if ($v>0) {
                $this->gettree($list, $node, $tree);
            }

            if (!empty($parent)) {
                $parent['children'][]=$node;
            } else{
                $tree[]=$node;
            }
        }
        
        return $tree;
    }

這種實現一個是練習php的遞迴,另一個是學習linq的php用法,還有個簡易的程式碼來實現遞迴樹,同事給的,在我這裡跑不起來

function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = 'children', $root = 0)
    {
        // 建立Tree
        $tree = array();
        if (is_array($list)) {
            // 建立基於主鍵的陣列引用
            foreach ($list as $key => $data) {
                $refer[$data[$pk]] =& $list[$key];
            }
            foreach ($list as $key => $data) {
                // 判斷是否存在parent
                $parentId = $data[$pid];
                if ($root == $parentId) {
                    $tree[] =& $list[$key];
                } else {
                    if (isset($refer[$parentId])) {
                        $parent =& $refer[$parentId];
                        $parent[$child][] =& $list[$key];
                        // $parent['children'][] =& $list[$key];
                    }
                }
            }
        }
        return $tree;
    }