PHP不使用递归的无限级分类
不用递归实现无限级分类,简单测试了下性能比递归稍好一点点点,但写得太复杂了,还是递归简单方便点
代码:
<?php
$list = array(
array('id'=>1, 'pid'=>0, 'deep'=>0, 'name'=>'test1'),
array('id'=>2, 'pid'=>1, 'deep'=>1, 'name'=>'test2'),
array('id'=>3, 'pid'=>0, 'deep'=>0, 'name'=>'test3'),
array('id'=>4, 'pid'=>2, 'deep'=>2, 'name'=>'test4'),
array('id'=>5, 'pid'=>2, 'deep'=>2, 'name'=>'test5'),
array('id'=>6, 'pid'=>0, 'deep'=>0, 'name'=>'test6'),
array('id'=>7, 'pid'=>2, 'deep'=>2, 'name'=>'test7'),
array('id'=>8, 'pid'=>5, 'deep'=>3, 'name'=>'test8'),
array('id'=>9, 'pid'=>3, 'deep'=>2, 'name'=>'test9'),
);
function resolve($list) {
$newList = $manages = $deeps = $inDeeps = array();
foreach ($list as $row) {
$newList[$row['id']] = $row;
}
$list = null;
foreach ($newList as $row) {
if (! isset($manages[$row['pid']]) || ! isset($manages[$row['pid']]['children'][$row['id']])) {
if ($row['pid'] > 0 && ! isset($manages[$row['pid']]['children'])) $manages[$row['pid']] = $newList[$row['pid']];
$manages[$row['pid']]['children'][$row['id']] = $row;
}
if (! isset($inDeeps[$row['deep']]) || ! in_array($row['id'], $inDeeps[$row['deep']])) {
$inDeeps[$row['deep']][] = array($row['pid'], $row['id']);
}
}
krsort($inDeeps);
array_shift($inDeeps);
foreach ($inDeeps as $deep => $ids) {
foreach ($ids as $m) {
// 存在子栏目的进行转移
if (isset($manages[$m[1]])) {
$manages[$m[0]]['children'][$m[1]] = $manages[$m[1]];
$manages[$m[1]] = null;
unset($manages[$m[1]]);
}
}
}
return $manages[0]['children'];
}
递归实现
function resolve2(& $list, $pid = 0) {
$manages = array();
foreach ($list as $row) {
if ($row['pid'] == $pid) {
$manages[$row['id']] = $row;
$children = resolve2($list, $row['id']);
$children && $manages[$row['id']]['children'] = $children;
}
}
return $manages;
}
PHP不使用递归的无限级分类的更多相关文章
- thinkphp框架中使用递归实现无限级分类
无限级分类在我们开发中显得举足轻重,会经常被人问到,而一般会用递归的方法来实现,但是递归又会难倒一批人.今天博主分享的这个稍微有点基础的phper都能学会,希望大家能喜欢. 一.先建立对应的数据库和表 ...
- (实用篇)PHP递归实现无限级分类
在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信 ...
- PHP迭代与递归实现无限级分类
无限级分类是开发中常见的情况,因此本文对常见的无限极分类算法进行总结归纳. 1.循环迭代实现 $arr = [ 1=>['id'=>1,'name'=>'父1','father'=& ...
- PHP递归实现无限级分类
在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信 ...
- php递归实现无限级分类树
作者: PHP中文网|标签:PHP 递归 无限级树|2017-5-18 18:09 无限级树状图可以说是无限级栏目的一个显著特征,我们接下来就来看看两种不同的写法. 一.数据库设计 1 2 3 ...
- PHP 递归读取无限级分类
/** * [获取第一级分类] * 20170829 * * @return array */ public function getCateList(){ $this->catelog = [ ...
- PHP递归重新排序无限级分类数组
public static function Menus($id,$spac=0){ /* $data = array( 1 => array('id' => 1,'name' => ...
- PHP无限级分类的实现(不使用递归)
无限级分类在开发中经常使用,例如:部门结构.文章分类.无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在 ...
- PHP+MySQL无限级分类(非递归)
要实现无限级分类,递归一般是第一个也是最容易想到的,但是递归一般被认为占用资源的方法,所以很多系统是不考虑使用递归的 本文还是通过数据库的设计,用一句sql语句实现 数据库字段大概如下: 字段 说明 ...
随机推荐
- HTTP报文格式详解
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的.HTTP有两类报文:请求报文和响应报文. HTTP请求报文 一个HTTP请求报文由请求行(request ...
- Competitive
- iOS国际化和genstrings所有子目录本地化字符串
最近在忙着一个国外项目,天天加班,没时间更新博客.就简单讲讲国际化的知识. 首先,我们使用字符串,必须用NSLocalizedString(key,comment),这样我们在不同的Localizab ...
- Linux下搭建Nginx+MySQL+PHP
在CentOS6.3下实践通过. 1.关闭防火墙 [root@CentOS ~]# chkconfig iptables off 2.关闭selinux vi /etc/sysconfig/selin ...
- WPF中StackPanel的使用方法
StackPanel 1.StackPanel:释义为是最简单的控制面板,它把其中的UI元素按横向或纵向堆积排列. 2.常用属性:width:获取或设置元素的宽度.Orientation:用于控制面板 ...
- 多个AsynceTask无法同时运行的现象分析
关于这篇博客所提到的问题是在一段再简单不过的代码中意外出现的.当时我使用了两个不同'AsyncTask'帮助我执行两个需要在后台执行任务.并且这两个'AsyncTask'几乎是同时运行的.原本会正常运 ...
- 在WebStorm中集成Karma+jasmine进行前端单元测试
在WebStorm中集成Karma+jasmine进行前端单元测试 前言 好久没有写博了,主要还是太懒=.=,有点时间都去带娃.看书了,今天给大家分享一个原创的小东西,如果大家对TDD或者BDD有兴趣 ...
- Newlife商业源码分享
[商业源码]生日大放送-Newlife商业源码分享 今天是农历六月二十三,是@大石头的生日,记得每年生日都会有很劲爆的重量级源码送出,今天Newlife群和论坛又一次疯狂了,吃水不忘挖井人,好的东西肯 ...
- Good Vim plugin for python [Vim python mode]
Here I got a very neat plugin for vim which is awesome indeed. It's from youtube years before. So le ...
- starling性能优化
在项目开发的过程中总结了一下starling的性能优化方案: 1. 不要频繁的读取显示对象的宽高:调用宽高属性时会调用显示对象的getBounds()方法,该方法会遍历该对象的所有子对象,重新 ...