贴一个无限极分类的算法,做个笔记。垃圾的csdn

<?php
namespace app\index\controller;

class Index
{
    
    public function study(){
        $city_arr = [
            ['id'=>1,'name'=>'山东省','pid'=>0],
            ['id'=>2,'name'=>'河北省','pid'=>0],
            ['id'=>3,'name'=>'烟台市','pid'=>1],
            ['id'=>4,'name'=>'威海市','pid'=>1],
            ['id'=>5,'name'=>'牟平区','pid'=>3],
            ['id'=>6,'name'=>'桃村镇','pid'=>7],
            ['id'=>7,'name'=>'栖霞市','pid'=>3],
            ['id'=>8,'name'=>'唐家泊镇','pid'=>7],
            ['id'=>9,'name'=>'后野村','pid'=>8],
            ['id'=>10,'name'=>'田里村','pid'=>8]
        ];
        
        $city_f = $this->make_tree($city_arr);
        return json($city_f);
    }
    
    public function make_tree($arr,$mkey='id',$pkey='pid',$level=0,$ckey='child'){
        $tree = [];
        $in_arr = [];
        
        //提取索引到主键中
        foreach ($arr as $key=>$value){
          $in_arr[$value[$mkey]]  = $value;
        }

        //pid为0的直接返回 不为零则找到上级,放在上级目录下面
        foreach ($in_arr as $key=>$value){
          if($value[$pkey] == $level){
              $tree[] = &$in_arr[$key];
          }else{
              $in_arr[$value[$pkey]][$ckey][] = &$in_arr[$key];
          }
        }

        return $tree;
    }
}