无限极分类的新算法–减少数据库查询|时刻需

阅读次数: 3,342

  • A+
所属分类:PHP PHP 建站 语言学习

今天突然感觉之前写的用数据库查询+递归的方法有些问题(数据库压力,递归时消耗服务器内存)虽然可以用缓存机制减少压力,但终觉不妥。

不多说直接上思路:

1.查出 1级分类

2.查出 2级分类

3.查出 3级分类

4.查出 n级分类

5.将查出的数据存入 data 如 data[1],data[2],data[3],data[n]

6.重新整理数据获取 无限极分类的最终数据

模拟代码:

<?php
/**
 * Created by 大师兄
 * 派系: 神秘剑派
 * 技能: zxc秒杀
 * Date: 2018-12-20
 * Time: 22:49
 * QQ:  997823131 
 */


$t1 = microtime(true);



header("Content-type:text/html; charset=utf-8");
function p($data){
    echo '<pre>';
    print_r($data);
    echo '</pre>';
}

$data1 = array(
    array(
        'id'=>1,
        'pid'=>0,
        'name'=>'一级分类1',
        'level'=>'1'
        ),
    array(
        'id'=>2,
        'pid'=>0,
        'name'=>'一级分类2',
        'level'=>'1'
    ),
    array(
        'id'=>3,
        'pid'=>0,
        'name'=>'一级分类3',
        'level'=>'1'
    ),
);

$data2 = array(
    array(
        'id'=>4,
        'pid'=>2,
        'name'=>'二级分类1',
        'level'=>2
    ),
    array(
        'id'=>5,
        'pid'=>2,
        'name'=>'二级分类2',
        'level'=>2
    ),
    array(
        'id'=>6,
        'pid'=>3,
        'name'=>'二级分类3',
        'level'=>2
    ),
    array(
        'id'=>7,
        'pid'=>3,
        'name'=>'二级分类4',
        'level'=>2
    ),
    array(
        'id'=>8,
        'pid'=>1,
        'name'=>'二级分类5',
        'level'=>2
    ),
    array(
        'id'=>9,
        'pid'=>2,
        'name'=>'二级分类6',
        'level'=>2
    ),
);

$data3 = array(
    array(
        'id'=>10,
        'pid'=>8,
        'name'=>'三级分类7',
        'level'=>3
    ),
    array(
        'id'=>11,
        'pid'=>8,
        'name'=>'三级分类8',
        'level'=>3
    ),
    array(
        'id'=>12,
        'pid'=>9,
        'name'=>'三级分类9',
        'level'=>3
    ),
    array(
        'id'=>13,
        'pid'=>9,
        'name'=>'三级分类10',
        'level'=>3
    ),
    array(
        'id'=>14,
        'pid'=>8,
        'name'=>'三级分类11',
        'level'=>3
    ),
    array(
        'id'=>14,
        'pid'=>8,
        'name'=>'三级分类11',
        'level'=>3
    ),array(
        'id'=>14,
        'pid'=>8,
        'name'=>'三级分类11',
        'level'=>3
    ),array(
        'id'=>14,
        'pid'=>8,
        'name'=>'三级分类11',
        'level'=>3
    ),array(
        'id'=>14,
        'pid'=>8,
        'name'=>'三级分类11',
        'level'=>3
    ),
);

$data[1] = $data1;
$data[2] = $data2;
$data[3] = $data3;

function calc_data($son_data,&$p_data){
    foreach($son_data as $k=>$v){
        foreach($p_data as $k_pre => $v_pre){
            if($v['pid'] == $v_pre['id']){
                $p_data[$k_pre]['son'][] = $v;
                array_splice($son_data,$k,1);
            }
        }
    }
}



$max_num = 3;// 分类的最大级别 可以通过 跳节点 方法 获取 分类的层级   也可以通过group 分类level 的 方法 获取
$min_num = 1;//一级分类


for($i=$max_num;$i>$min_num;$i--){
    calc_data($data[$i],$data[$i-1]);
}
p($data[1]);
$t2 = microtime(true);
echo '耗时'.round($t2-$t1,8).'秒<br>';
echo '内存: ' . memory_get_usage() . '<br />';

其中需要加上 array_splice方法 会提升执行速度。

测试结果

耗时 0.004999 0.00600 (有array_splice)
内存 286072

耗时 0.00599 0.00800 (无)
内存 400008

当数据越大时,相差越大。

时刻需

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: