给定省市地区数组如下:

$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. c语言的作用域、变量与结构体

    一.变量的作用域 根据变量的作用域,可以分为: 1.局部变量: 1> 定义:在函数(代码块)内部定义的变量(包括函数的形参) 2> 作用域:局部变量只有在定义它的函数内部使用,其它函数不能 ...

  2. 2017计算机学科夏令营上机考试-C:岛屿面积

    总时间限制:  1000ms 内存限制:  65536kB 描述 用一个n*m的二维数组表示地图,1表示陆地,0代表海水,每一格都表示一个1*1的区域.地图中的格子只能横向或者纵向连接(不能对角连接) ...

  3. 全内存的redis用习惯了?使用基于硬盘存储类似redis的nosql产品ssdb呢?

    首先说一下背景,在双十一的时候,我们系统接受X宝的订单推送,同事原先的实现方式是使用redis的List作为推送数据的承载,在非大促的场景下, 一切运行正常,内存占用大概3-4G,机器是16G内存.由 ...

  4. [Machine Learning]学习笔记-线性回归

    模型 假定有i组输入输出数据.输入变量可以用\(x^i\)表示,输出变量可以用\(y^i\)表示,一对\(\{x^i,y^i\}\)名为训练样本(training example),它们的集合则名为训 ...

  5. Cell重用时数据混乱的管理方法

    UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件.上面主要是一个个的UITableViewCell,可以让UITableViewCell响应一些点击 ...

  6. Solidity教程系列1 - 类型介绍

    现在的Solidity中文文档,要么翻译的太烂,要么太旧,决定重新翻译下,再加上代码事例讲解. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解, 如果 ...

  7. WPF自定义产品框架

    在讲解之前先看一下效果,有助于理解: 这是客户端的效果图.整个产品分为两部分:1.WPF开发的展示效果的客户端   2.WCF开发的提供数据服务接口的服务端   本章主要讲解一下实际中开发WPF开发客 ...

  8. 基于iTextSharp的PDF文档操作

    公司是跨境电商,需要和各种物流打交道,需要把东西交给物流,让他们发到世界各地.其中需要物流公司提供一个运单号,来追踪货物到达哪里?! 最近在和DHL物流公司(应该是个大公司)对接,取运单号的方式是调用 ...

  9. maven项目pom.xml配置文件依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  10. 逐步搭建Lamp环境之vim的三种模式以及基本命令

    在Linux中vim的三种模式分别为:命令模式.末行模式.编辑模式.以下是三者的关系图: 三种模式的彼此切换: 命令模式是vim中的默认模式. 命令模式切换至末行模式: 使用英文冒号(:). 末行模式 ...