PHP-无限级分类
给定省市地区数组如下:
$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('      ',$val['jibie']),$val['name'],'<br/>';
}
/*
经过测试这个方法我只求出了它的父亲以上的栏目,它自己没有存入,也请大家帮忙修改
这个方法造成的缺陷就是在例如面包屑导航条上有bug
*/
PHP-无限级分类的更多相关文章
- PHP无限级分类的实现(不使用递归)
无限级分类在开发中经常使用,例如:部门结构.文章分类.无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在 ...
- 一道无限级分类题的 PHP 实现
今天有网友出了道题: 给出如下的父子结构(你可以用你所用语言的类似结构来描述,第一列是父,第二列是子),将其梳理成类似如图的层次父子结构. origin = [('A112', 'A1122'), ( ...
- (实用篇)PHP递归实现无限级分类
在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信 ...
- php利用递归函数实现无限级分类
相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径.各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了. 什么是无限级分类? 无限级分类是 ...
- PHP+MySQL无限级分类(非递归)
要实现无限级分类,递归一般是第一个也是最容易想到的,但是递归一般被认为占用资源的方法,所以很多系统是不考虑使用递归的 本文还是通过数据库的设计,用一句sql语句实现 数据库字段大概如下: 字段 说明 ...
- PHP无限级分类-递归(不推荐)
[http://www.helloweba.com/view-blog-204.html] 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢? ...
- PHP无限级分类生成树实例代码
分享一例php无限级分类生成树的代码,学习下php无限级分类的实现方法,有需要的朋友参考下. 一段非常精简的PHP无限极分类生成树方法,巧在引用. 例子,php实现无限级分类. 代码示例: ...
- php非递归无限级分类.
项目需要.递归无限级分类效率实在太低.理了半天思路写的. 分类越多效率越高. /** * 单次循环返回无限极分类嵌套 * @param array $data 操作的数组 * @param strin ...
- 转:php+mysql菜单无限级分类(非递归)
php+mysql无限级分类(非递归) 参考:http://www.chhua.com/web-note3244
- SQL 无限级分类语句
原文:SQL 无限级分类语句 原表数据为: 此处用到了with关键字,在程序中也可以用递归实现,但觉得还是没有一条sql方便 with tb (ID,Name,ParentID,Sort) as( s ...
随机推荐
- 74、django之ajax补充
之前的ajax使用都是依据jquery来使用的,本篇会先分析ajax的原生的js代码实现,还有jsonp的介绍,与OMR的一些遗漏补充. 本篇导航: js实现的ajax 同源策略与Jsonp 一.js ...
- uva11636-Hello World!
题意:已知有一行printf(“Hello World!”\n);以后就可以复制,问多少次之后就可以达到所需要的行数. 题解:模拟: #include<iostream> #include ...
- Android APP 性能优化的一些思考
说到 Android 系统手机,大部分人的印象是用了一段时间就变得有点卡顿,有些程序在运行期间莫名其妙的出现崩溃,打开系统文件夹一看,发现多了很多文件,然后用手机管家 APP 不断地进行清理优化 ,才 ...
- mysql主从复制笔记
一:测试环境介绍 主从复制测试环境是ubuntu+mysql5.7,master服务器ip是192.168.71.135,slave服务器ip是192.168.71.137,ubuntu环境是从一台已 ...
- Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇--纯前端多页面) @(HTML/JS) 一般来说,使用vue做成单页应用比较好,但特殊情况下,需要使用多页面也有另外 ...
- 《RabbitMQ Tutorial》译文 第 2 章 工作队列
源文来自 RabbitMQ 英文官网的教程(2.Work Queues),其示例代码采用了 .NET C# 语言. In the first tutorial we wrote programs to ...
- mac下出现xcrun: error导致git、svn无法使用的解决办法
现象:xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun ...
- Oracle基础知识整理
Oracle以dba身份登陆 sqlplus / as sysdba; 表空间操作 创建用户以及授权操作 --创建表 create table teacher ( tNo number(4) no ...
- Markdown语法入门
本文内容参考与这里,本篇文档,用Markdown语法写成. 概述 宗旨 Markdown 的目标是实现「易读易写」. 可读性,无论如何,都是最重要的.一份使用 Markdown 格式撰写的文件应该可以 ...
- Java开发小技巧(二):自定义Maven依赖
前言 我们在项目开发中经常会将一些通用的类.方法等内容进行打包,打造成我们自己的开发工具包,作为各个项目的依赖来使用. 一般的做法是将项目导出成Jar包,然后在其它项目中将其导入,看起来很轻松,但是存 ...