php递归无限极分类|PHP实现无限极分类生成分类树的方法

更新时间:2021-08-17    来源:php与数据库    手机版     字体:

【www.bbyears.com--php与数据库】

现在的分类数据库设计基本都是:每一个分类有一个id主键字段,一个pid指向父类的id,这样便可实现无限级分类,取出的数据就是如下的格式:

$arr = array(
  array("id" => 1 , "pid" => 0 , "cat" => "栏目一"),
  array("id" => 2 , "pid" => 0 , "cat" => "栏目二"),
  array("id" => 3 , "pid" => 1 , "cat" => "栏目三"),
  array("id" => 4 , "pid" => 2 , "cat" => "栏目四"),
  array("id" => 5 , "pid" => 1 , "cat" => "栏目五"),
  array("id" => 6 , "pid" => 5 , "cat" => "栏目六"),
  array("id" => 7 , "pid" => 5 , "cat" => "栏目七"),
  array("id" => 8 , "pid" => 6 , "cat" => "栏目八"),
  array("id" => 9 , "pid" => 1 , "cat" => "栏目九"),
  array("id" => 10 , "pid" => 0 , "cat" => "栏目十"),
  array("id" => 11 , "pid" => 10 , "cat" => "栏目十一"),
  array("id" => 12 , "pid" => 11 , "cat" => "栏目十二"),
  array("id" => 13 , "pid" => 2 , "cat" => "栏目十三"),
  array("id" => 14, "pid" => 13 , "cat" => "栏目十四")
);

不多说,直接上处理代码:

//生成无限极分类树
function make_tree($arr){
  $refer = array();
  $tree = array();
  foreach($arr as $k => $v){
    $refer[$v["id"]] = & $arr[$k]; //创建主键的数组引用
  }
  foreach($arr as $k => $v){
    $pid = $v["pid"];  //获取当前分类的父级id
    if($pid == 0){
      $tree[] = & $arr[$k];  //顶级栏目
    }else{
      if(isset($refer[$pid])){
        $refer[$pid]["subcat"][] = & $arr[$k]; //如果存在父级栏目,则添加进父级栏目的子栏目数组中
      }
    }
  }
  return $tree;
}

测试运行:

$cat = make_tree($arr);
print_r($cat);

运行结果:

Array
(
  [0] => Array
    (
      [id] => 1
      [pid] => 0
      [cat] => 栏目一
      [subcat] => Array
        (
          [0] => Array
            (
              [id] => 3
              [pid] => 1
              [cat] => 栏目三
            )
          [1] => Array
            (
              [id] => 5
              [pid] => 1
              [cat] => 栏目五
              [subcat] => Array
                (
                  [0] => Array
                    (
                      [id] => 6
                      [pid] => 5
                      [cat] => 栏目六
                      [subcat] => Array
                        (
                          [0] => Array
                            (
                              [id] => 8
                              [pid] => 6
                              [cat] => 栏目八
                            )
                        )
                    )
                  [1] => Array
                    (
                      [id] => 7
                      [pid] => 5
                      [cat] => 栏目七
                    )
                )
            )
          [2] => Array
            (
              [id] => 9
              [pid] => 1
              [cat] => 栏目九
            )
        )
    )
  [1] => Array
    (
      [id] => 2
      [pid] => 0
      [cat] => 栏目二
      [subcat] => Array
        (
          [0] => Array
            (
              [id] => 4
              [pid] => 2
              [cat] => 栏目四
            )
          [1] => Array
            (
              [id] => 13
              [pid] => 2
              [cat] => 栏目十三
              [subcat] => Array
                (
                  [0] => Array
                    (
                      [id] => 14
                      [pid] => 13
                      [cat] => 栏目十四
                    )
                )
            )
        )
    )
  [2] => Array
    (
      [id] => 10
      [pid] => 0
      [cat] => 栏目十
      [subcat] => Array
        (
          [0] => Array
            (
              [id] => 11
              [pid] => 10
              [cat] => 栏目十一
              [subcat] => Array
                (
                  [0] => Array
                    (
                      [id] => 12
                      [pid] => 11
                      [cat] => 栏目十二
                    )
                )
            )
        )
    )
)

如果大家需要这样的组装格式,或者需要该格式方便后续的处理,可以尝试此方法

本文来源:http://www.bbyears.com/jiaocheng/136579.html

猜你感兴趣