- A+
今天突然感觉之前写的用数据库查询+递归的方法有些问题(数据库压力,递归时消耗服务器内存)虽然可以用缓存机制减少压力,但终觉不妥。
不多说直接上思路:
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
当数据越大时,相差越大。
- 我的微信
- 这是我的微信扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-