php遞迴樹的實現
阿新 • • 發佈:2019-01-04
使用到了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; }