PHP内存优化生成无限极分类(生成树结构)
来源:互联网 发布:南阳网络推广哪家好 编辑:程序博客网 时间:2024/05/19 19:13
PHP大部分人用递归来写生成树,不过PHP默认最多递归次数为100,并不是理论上的无限,其次递归的内存占有过大,php的内存分配是除了对象,其余的为直接copy内存,所以有时候会导致内存占用过大
如以下做法
$items = array( array('id' => 1, 'pid' => 0, 'name' => 'a'), array('id' => 3, 'pid' => 1, 'name' => 'b'), array('id' => 4, 'pid' => 3, 'name' => 'c'), array('id' => 5, 'pid' => 1, 'name' => 'd'),);function generateTree($items , $pId){ $tree = ''; foreach($items as $k => $v) { if($v['pid'] == $pId) { $v['pid'] = generateTree($items , $v['id']); $tree[] = $v; } } return $tree;}$tree = generateTree($items , 0);
改善思路是这样子的,先把每一个人的位置指针,赋值给父亲的son下面,但是他原有的位置依然不变以此类推,结束后只返回pid等于0的,pid等于0的下面的son就存着他子分类的id的指针,指向的区域位置依然不变,内存大小不变。
打个比方,假设每一个人都有一座房子,每个房子的位置铁打不变的(不动产,所以房价那么贵),这些房子是存着上下级的,例如房子1的主人是房子2的主人的爸爸,房子3的主人是房子2的儿子,房子4房子5的主人是房子3的儿子,这样子看上去好像无序一样,但是假设,房子1的主人手上有个族谱(
$item['son']
),上面写着:我有一个儿子,他的房子的门牌号是:×××(&$items_key [$item['id']]
),那我们只要找到他,把他return出来,其他的人以此类推都可以找到,而房子是没有发生位置上的变化的,房子的数量也是不变的。
$items = array( array('id' => 1, 'pid' => 0, 'name' => 'a'), array('id' => 3, 'pid' => 1, 'name' => 'b'), array('id' => 4, 'pid' => 3, 'name' => 'c'), array('id' => 5, 'pid' => 1, 'name' => 'd'), ); //先为在数据库查到的数据做索引,实际上取出的数据不可能是key与id对应,这里需要一个for先遍历取id作为key foreach($items as &$item_key){ $items_key[$item_key['id']] = &$item_key; } function generateTree( &$items_key ){ //输入变量用引用的方式,减少内存开支 foreach($items_key as &$item){ //foreach复制给$item如果下面的等于没有用【&】,内存依然会双倍,无法做到节省内存 $items_key [$item['pid']]['son'][$item['id']] = &$items_key [$item['id']]; } return isset($items_key [0]['son']) ? $items_key [0]['son'] : array(); } //假设$items的大小为1M,到最后内存的大小只是略大于1M(增加了指针大小)。 var_dump(generateTree($items));
阅读全文
0 0
- PHP内存优化生成无限极分类(生成树结构)
- PHP无限极分类巧用引用生成树
- php把数据集转换成树状结构,无限极分类生成树状
- php 无限分类 并生成树状图
- (修改递归错误)PHP 在无限级分类情况下,通过接口取出所有分类之后生成分类树
- 分享一个牛逼的PHP无限极分类生成树方法,巧用引用
- 一个牛逼的php无限极分类生成树的方法
- php递归实现无限分类生成下拉列表
- 无限分类生成HTML文件
- php无限极分类
- PHP无限极分类
- php无限极分类
- PHP无限极分类
- PHP无限极分类
- php无限极分类
- PHP无限极分类
- PHP 无限极分类
- PHP无限极分类
- mariadb数据库入门
- Spring Boot JPA 连接数据库
- AsyncTask的用法及注意点
- 【C++】指针1
- Spring Boot MyBatis 连接数据库
- PHP内存优化生成无限极分类(生成树结构)
- 团队管理随想之项目外包
- 1038. 统计同成绩学生(20)
- Spring Boot 多数据源
- python 多进程模块 multiprocessing
- Spring Boot Shiro 权限管理
- C#学习总结(4)——DataGridView和ContextMenuStrip
- 053day(成员对象和封闭类,常量对象,常量成员函数)
- Android各个版本的特征