给定省市地区数组如下:

$area = array(
                   array('id'=>1,'name'=>'安徽','parent'=>'0'),
                   array('id'=>2,'name'=>'海淀','parent'=>'7'),
                   array('id'=>3,'name'=>'濉溪县','parent'=>'5'),
                   array('id'=>4,'name'=>'昌平','parent'=>'7'),
                   array('id'=>5,'name'=>'淮北','parent'=>'1'),
                   array('id'=>6,'name'=>'朝阳','parent'=>'7'),
                   array('id'=>7,'name'=>'北京','parent'=>'0'),
                   array('id'=>8,'name'=>'上地','parent'=>'2')   
       );

无限级分类的应用有如下几种:

1、找指定栏目的子栏目

2、找指定栏目的子孙栏目--子孙树

3、找指定栏目的父栏目/父父栏目....------家谱树

#找指定栏目的子栏目#

function sontree($arr,$id=0){//默认从顶级栏目开始找

$son = array();

 foreach($arr as $v){

    if($v['parent'] == $id){

         $son[] = $v;

    }

}
return $sons;
} echo '<pre>'; print_r(sontree($area,0)); echo'</pre>';

#找指定栏目的子孙栏目--子孙树#

function substree($arr,$id=0,$jibie=0){

       $tree = array();

    foreach($arr as $v){

       if($v['parent'] == $id){

               $tree[] = $v;

               $v['jibie'] = $jibie;

               $tree = array_merge($tree,subtree($arr,$v['id']),$jibie+1);

}

   return $tree;

}

}

echo '<pre>';

print_r(substree($area,0));

echo'</pre>';

//真实案例:部门职工树

private function _deptspns($lv,$pid){
$db = m('dept');
$s = '';
$r = m('admin')->getone("id='".$this->adminid."'",'type,deptid');
if($r['type']==0)$s = ' and id=\''.$r['deptid'].'\'';
$rows = $db->getall(" `pid`='".$pid."' $s order by `sort`",'*');
$da = array();
if(count($rows)){
foreach($rows as $k=>$mv){
$da[$k] = array(
'id'=>$mv['id'],
'lv'=>$lv,
'name'=>$mv['name'],
'pid'=>$mv['pid'],
'expanded'=>true
);
$da[$k]['children'] = $this->_deptspns($lv+1,$mv['id']);
}
}
return $da;
}
$da = $this->_deptspns(1,0);

//方法二(static)

function substree($arr,$id=0,$jibie=0){

       static $tree = array();

    foreach($arr as $v){

       if($v['parent'] == $id){
     $v['jibie'] = $jibie;
$tree[] = $v;
subtree($arr,$v['id']),$jibie+1); } return $tree; } } echo '<pre>'; print_r(substree($area,0)); echo'</pre>';

#家谱树#

//方法一

 function parenttree($arr,$id=0){

                  $par = array();

                   foreach($arr as $v){

         if($v['id'] == $id)

           {

                 

                                        if($v['parent'] > 0){ //如果为0就是顶级 它没有父栏目....

                array_merge($par,parenttree($arr,$v['[parent']));

              $par[] = $v;//第一次把自己存入
/*把$par[] = $v;/写在后面 array_merge($par,parenttree($arr,$v['[parent']));就是先进后出
结果可以是:北京-》海淀-》上地
写在前面结果相反
递归递归-先递在归
*/               }             } } return $par; } echo '<pre>'; print_r(parenttree($area,0)); echo '</pre>';

方法二:

  function parenttree($arr,$sid=0,$jibie=1){
static $parent = array();
static $pid = null;
foreach($arr as $val){
if($sid == $val['id']){
$pid = $val['parent'];
//$parent[] = $val;
}
}
foreach($arr as $val1){
if($pid == $val1['id']){
$val1['jibie'] = $jibie;
$parent[] = $val1;
parenttree($arr,$pid,$jibie+1);
}
}
return $parent;
}
echo '<pre>';
print_r(parenttree($area,8,1));
echo '</pre>';
exit;
$parent_arr = parenttree($area,8,1);
foreach($parent_arr as $val){
echo @str_repeat('&nbsp;&nbsp&nbsp;&nbsp&nbsp;&nbsp',$val['jibie']),$val['name'],'<br/>';
}
/*
经过测试这个方法我只求出了它的父亲以上的栏目,它自己没有存入,也请大家帮忙修改
这个方法造成的缺陷就是在例如面包屑导航条上有bug
*/
												

PHP-无限级分类的更多相关文章

  1. PHP无限级分类的实现(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构.文章分类.无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在 ...

  2. 一道无限级分类题的 PHP 实现

    今天有网友出了道题: 给出如下的父子结构(你可以用你所用语言的类似结构来描述,第一列是父,第二列是子),将其梳理成类似如图的层次父子结构. origin = [('A112', 'A1122'), ( ...

  3. (实用篇)PHP递归实现无限级分类

    在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信 ...

  4. php利用递归函数实现无限级分类

    相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径.各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了. 什么是无限级分类? 无限级分类是 ...

  5. PHP+MySQL无限级分类(非递归)

    要实现无限级分类,递归一般是第一个也是最容易想到的,但是递归一般被认为占用资源的方法,所以很多系统是不考虑使用递归的 本文还是通过数据库的设计,用一句sql语句实现 数据库字段大概如下: 字段 说明 ...

  6. PHP无限级分类-递归(不推荐)

    [http://www.helloweba.com/view-blog-204.html] 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢? ...

  7. PHP无限级分类生成树实例代码

    分享一例php无限级分类生成树的代码,学习下php无限级分类的实现方法,有需要的朋友参考下.   一段非常精简的PHP无限极分类生成树方法,巧在引用.   例子,php实现无限级分类.   代码示例: ...

  8. php非递归无限级分类.

    项目需要.递归无限级分类效率实在太低.理了半天思路写的. 分类越多效率越高. /** * 单次循环返回无限极分类嵌套 * @param array $data 操作的数组 * @param strin ...

  9. 转:php+mysql菜单无限级分类(非递归)

    php+mysql无限级分类(非递归) 参考:http://www.chhua.com/web-note3244

  10. SQL 无限级分类语句

    原文:SQL 无限级分类语句 原表数据为: 此处用到了with关键字,在程序中也可以用递归实现,但觉得还是没有一条sql方便 with tb (ID,Name,ParentID,Sort) as( s ...

随机推荐

  1. 【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件

    关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本|Android 8.1   本 ...

  2. 在C#中输出变量的地址

    int a = 3; GCHandle handle = GCHandle.Alloc(a); var pin = GCHandle.ToIntPtr(handle); Console.WriteLi ...

  3. hdu 3829 Cat VS Dog 二分匹配 最大独立点集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 题目大意: 给定N个猫,M个狗,P个小朋友,每个小朋友都有喜欢或者不喜欢的某猫或者某狗 管理员从 ...

  4. NYOJ 138 找球号(二) bitset 二进制的妙用

    找球号(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 描述 在某一国度里流行着一种游戏.游戏规则为:现有一堆球中,每个球上都有一个整数编号i(0<=i< ...

  5. 2017最新PHP面试题

    这几天在面试,下面分享一下这几天面试所遇到的笔试题,目前还不打算工作,面试题会持续更新的,有些不想写答案了,有心的可以自己看着面试题查一下感觉记忆更深点.下面分享一下这几天遇到的php面试题. 掌贝面 ...

  6. Nginx的反向代理与负载均衡

    1.1 集群是什么 简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服器.这些服务器之间可 ...

  7. java.util.ArrayList、java.util.vector和java.util.LinkedList (JDK 1.8.0_111)

    一.java.util.ArrayList 1.1 ArrayList 继承结构 ArrayList实现了RandomAccess,可以随机访问(其实就是通过数组下标访问):实现了Cloneable, ...

  8. JavaScript面向对象编程(9)高速构建继承关系之整合原型链

    前面我们铺垫了非常多细节.是为了让大家更加明晰prototype的使用细节: 如今能够将前面的知识整合起来,写一个函数用于高速构建基于原型链的继承关系了: function extend(Child, ...

  9. [UWP]本地化入门

    1. 前言 上一篇文章介绍了各种WPF本地化的入门知识,这篇文章介绍UWP本地化的入门知识. 2. 使用resw资源文件实现本地化 在以前的XAML平台,resx资源文件是一种很方便的本地化方案,但在 ...

  10. java 拦截器

    一.前言 这是一篇关于 java 拦截器的文章,是我的写 java  web 所遇见的问题.当我们写好一个网站,必须要通过登陆页面才可以进入这个系统.那么我们就得写个 java 拦截器,如果是通过登录 ...