首页 > 技术文章 > PHP单次数据库查询实现无限级分类

XiaoMingBlingBling 2019-07-25 15:12 原文

 


 

这里使用一张简单的地区表举例,表字段如下:

 

使用Sql:

SELECT id, parentid, name FROM area;

 

查询得出的数据形如:

array(3362){
    [0] => array(3) {
        ["id"] => string(1) "1"
        ["parentid"] => string(1) "0"
        ["name"] => string(9) "北京"
      }
    [1] => array(3) {
        ["id"] => string(1) "2"
        ["parentid"] => string(1) "1"
        ["name"] => string(9) "北京市"
    }
    [2] => array(3) {
        ["id"] => string(1) "3"
        ["parentid"] => string(1) "2"
        ["name"] => string(9) "东城区"
    }
    [3] => array(3) {
        ["id"] => string(1) "4"
        ["parentid"] => string(1) "2"
        ["name"] => string(9) "西城区"
    }
    [4] => array(3) {
        ["id"] => string(1) "5"
        ["parentid"] => string(1) "2"
        ["name"] => string(9) "崇文区"
    }
...... }

 

 使用函数xmsb_getDataTree:

/**
 * @desc   xmsb_getDataTree         无限级分类函数
 * @param  array     $datas         查询出的数据
 * @param  string    $primaryKey    数据表的主键
 * @param  string    $parentKey     父节点字段名
 * @param  string    $nameKey       需要用到的名称字段
 * @param  integer   $firstParent   根节点主键值
 * @return array                    返回树状结果集
 */
function xmsb_getDataTree($datas, $primaryKey, $parentKey, $nameKey, $firstParent = 0)
{
    if(!is_array($datas) || !$primaryKey || !$parentKey || !$nameKey) return false;
    
    $tree = array($primaryKey => 0, $parentKey => 0, $nameKey => 'xmsb');
    $tmpMap = array($firstParent => & $tree);
    
    foreach($datas as $rk => $rv)
    {
        $tmpMap[$rv[$primaryKey]] = array
        (
            $primaryKey => $rv[$primaryKey],
            $parentKey => $rv[$parentKey],
            $nameKey => $rv[$nameKey]
        );
        
        $parentObj = & $tmpMap[$rv[$parentKey]];
        if(!$parentObj['children']) $parentObj['children'] = array();
        $parentObj['children'][] = & $tmpMap[$rv[$primaryKey]];
    }
    
    return $tree['children'];
}

 

返回值形如:

array(34) {
    [0] => array(4) {
        ["id"] => string(1) "1"
        ["parentid"] => string(1) "0"
        ["name"] => string(9) "北京"
        ["children"] => array(1) {
            [0] => array(4) {
                ["id"] => string(1) "2"
                ["parentid"] => string(1) "1"
                ["name"] => string(9) "北京市"
                ["children"] => array(18) {
                    [0] => array(3) {
                        ["id"] => string(1) "3"
                        ["parentid"] => string(1) "2"
                        ["name"] => string(9) "东城区"
                    }
                    [1] => array(3) {
                        ["id"] => string(1) "4"
                        ["parentid"] => string(1) "2"
                        ["name"] => string(9) "西城区"
                    }
                    ......
                }
            }
       ...... } }
...... }

推荐阅读