1. 程式人生 > 實用技巧 >PHP實現無極限分類

PHP實現無極限分類

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;
    }

   $arr = array(
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);

 

 效果如下: