• php 实现树形结构


    <?php
    class Tree{
    private $OriginalList;
    public $pk;//主键字段名
    public $parentKey;//上级id字段名
    public $childrenKey;//用来存储子分类的数组key名

    function __construct($pk="id",$parentKey="pid",$childrenKey="children"){
    if(!empty($pk) && !empty($parentKey) && !empty($childrenKey)){
    $this->pk=$pk;
    $this->parentKey=$parentKey;
    $this->childrenKey=$childrenKey;
    }else{
    return false;
    }

    }
    //载入初始数组
    function load($data){
    if(is_array($data)){
    $this->OriginalList=$data;
    }
    }

    /**
    * 生成嵌套格式的树形数组
    * array(..."children"=>array(..."children"=>array(...)))
    */
    function DeepTree($root=0){
    if(!$this->OriginalList){
    return FALSE;
    }
    $OriginalList=$this->OriginalList;
    $tree=array();//最终数组
    $refer=array();//存储主键与数组单元的引用关系
    //遍历
    foreach($OriginalList as $k=>$v){
    if(!isset($v[$this->pk]) || !isset($v[$this->parentKey]) || isset($v[$this->childrenKey])){
    unset($OriginalList[$k]);
    continue;
    }
    $refer[$v[$this->pk]]=&$OriginalList[$k];//为每个数组成员建立引用关系
    }
    //遍历2
    foreach($OriginalList as $k=>$v){
    if($v[$this->parentKey]==$root){//根分类直接添加引用到tree中
    $tree[]=&$OriginalList[$k];
    }else{
    if(isset($refer[$v[$this->parentKey]])){
    $parent=&$refer[$v[$this->parentKey]];//获取父分类的引用
    $parent[$this->childrenKey][]=&$OriginalList[$k];//在父分类的children中再添加一个引用成员
    }
    }
    }
    return $tree;
    }
    }
    $data=array(
    0 => array("id"=>1,"pid"=>0),
    1 => array("id"=>2,"pid"=>0),
    2 => array("id"=>3,"pid"=>1),
    3 => array("id"=>4,"pid"=>3),
    4 => array("id"=>5,"pid"=>2),
    );
    var_dump($data);
    $tree=new Tree("id","pid","children");
    $tree->load($data);
    $treelist=$tree->DeepTree();//所有分类树结构
    var_export($treelist);//查看结果
    $subtree=$tree->DeepTree(1);//获取id为1下面的子树
    var_export($subtree);
    ?>

    转自http://www.thinkphp.cn/topic/7487.html

  • 相关阅读:
    mysql 查询当月天数
    mybatis <collection>标签 类型为string时无法获取重复数据错误
    eclipse 关闭validating
    YAGNI 声明
    tomcat 异常
    svn 用cmd命令行启动服务
    linux 命令
    windows10安装liux系统
    一带一路是个啥?
    串口通信协议
  • 原文地址:https://www.cnblogs.com/liuwenbohhh/p/4441421.html
Copyright © 2020-2023  润新知