首页 > 技术文章 > PHP 开发过程中 常用的树形结构

cbywan 2019-01-15 08:54 原文

1.查询的数据集 转换成树形结构

function list_go_tree($list, $pk='id',$pid = 'pid',$child = '_child',$root=0) {
    // 创建Tree
    $tree = array();
    if(is_array($list)) {
        // 创建基于主键的数组引用
        $refer = array();
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] =& $list[$key];
        }
        foreach ($list as $key => $data) {
            // 判断是否存在parent
            $parentId = $data[$pid];
            if ($root == $parentId) {
                $tree[] =& $list[$key];                

            }else{
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];
                    $list[$key]['name']='—'.$list[$key]['name'];
                    $parent[$child][] =& $list[$key];
                }
            }
        }
    }
    return $tree;

2.第二种 纯递归树形结构

function testdigui2($data,$deptid=0){
    $child = [];

    foreach ($data as $key => $value) {
        if($value['pid'] == $deptid){
            $child[$value['deptid']] = $value;
            //去掉自己 自己不可能是自己儿子的儿孙
            unset($data[$key]);
            $child[$value['deptid']]['child'] = testdigui2($data,$value['deptid']);
        }
    }
    return $child;
}

  

2.把查询的结果集 下拉的方式显示

/**
 * 通过传入要查找的人的pid来递归查找他的下属 (新)
 * @param  array  $data    数组代替数据库中的数据
 * @param  integer $pid     父id
 * @param  array   &$result 结果数组,&保证变量常驻
 * @param  integer $deep    输出的分隔符--,无实际意义
 * @return 树状结构数组
 */
function getListinfo( $data, $pid=0, &$result=array(), $deep = 0 ) {
    $deep+=1;
    foreach ( $data as $key => $val ) {
     if ( $pid == $val['pid'] ) {
            $result[$key]['deptname'] = $val['deptname'];
           $result[$key]['deptid'] = $val['deptid'];
            $result[$key]['deptpid'] = $val['pid'];
              getListinfo( $data, $val['deptid'],  $result, $deep );
      }
    }
    return $result;
}

  

推荐阅读