PHP實現無極限分類
阿新 • • 發佈:2020-09-12
PHP實現無極限分類
1、新增子目錄
<?php /** * @description * @param array $arr 二維陣列 * @param string $pk 主鍵id * @param string $upid 表示父級id的欄位 * @param string $child 子目錄的鍵 * @return array */ function getTree($arr=array(),$pk='id',$upid='pid',$child='child'){ $items = array(); foreach($arr as $val){ $items[$val[$pk]] = $val; } $tree = array(); foreach($items as $k=>$val){ if(isset($items[$val[$upid]])){ $items[$val[$upid]][$child][]=&$items[$k]; }else{ $tree[] = &$items[$k]; } } return $tree; }
array('id' => 1, 'name' => '系統設定', 'pid' => 0),
array('id' => 2, 'name' => '選單設定', 'pid' => 0),
array('id' => 3, 'name' => '新增選單', 'pid' => 2),
array('id' => 4, 'name' => '編輯選單', 'pid' => 2),
array('id' => 7, 'name' => '修改選單', 'pid' => 4),
array('id' => 5, 'name' => '網站設定', 'pid' => 1),
array('id' => 6, 'name' => '支付設定', 'pid' => 0)
getTree($arr);
?>
效果如下:
2、樹形結構
<?php /** * @description * @param array $arr 傳入的二維陣列 * @param string $pk 主鍵id * @param string $name 分類名稱 * @param string $upid 表示父級id的欄位 * @param int $root 根級別(最高父級一般為0) * @param int $index 層級 * @return array */ function getTree($arr = array(),$pk='id',$name='name',$upid='pid',$root=0,$index=0){ $tree = array(); foreach ($arr as $k=>$value) { if($value[$upid]==$root){ $value[$name] = str_repeat('|--', $index).$value[$name]; $tree[] = $value; $tree = array_merge($tree,getTree($arr,$value[$pk],$index+1)); } } return $tree; } ?>
3.生成HTML分類程式碼
/** * @description * @param $data 為呼叫上面方法2(新增子目錄)得到的結果 */ function makeHtml($data,&$str='') { $str .= '<ul>'; foreach ($data as $key => $val) { $cateId = $val['id']; if (isset($val['child']) && !empty($val['child'])) { $str .= "<li class='hasChild top'><a data-id='{$cateId}'>" . $val['name'] . "</a>"; makeHtml($val['child'],$str); $str .= '</li>'; } else { $className = $val['pid'] == 0 ? 'top' : ''; $str .= "<li class='{$className}'><a data-id='{$cateId}'>" . $val['name'] . "</a></li>"; } } $str .= '</ul>'; return $str; }
echo makeHtml($data);
效果如下: