Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5096790
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类:

2007-01-14 01:54:40

php 无限分类 核心算法


请看下面的 核心算法(如果您在你的项目中使用本核心算法,请您注明)


/*
说明:

$arr (array)  型如:
array(
0=>array(
'cate_id'=11,
'per_id'=0,
'cate_name'='a'
),
1=>array(
'cate_id'=12,
'per_id'=0,
'cate_name'='b'
),
2=>array(
'cate_id'=13,
'per_id'=11,
'cate_name'='a10'
),
....);

$arr2 (array) 排序后的结果 ,型如:
array(
0=>array(
'cate_id'=11,
'per_id'=0,
'lv'=0,
'cate_name'='a'
),
1=>array(
'cate_id'=13,
'per_id'=11,
'lv'=1,
'cate_name'='a10'
),
2=>array(
'cate_id'=12,
'per_id'=0,
'lv'=0,
'cate_name'='b'
),
....);


$per_id   父类id ,从0开始,

$lv    层编号,  父类为 0, 子类以它的父类层编号加1,  

$i 循环计数器.
*/

function cate_arr($arr,&$arr2=array(),$per_id=0,$lv=0){
  static  $i=0;  //从0开始

  if ((bool)$arr) {
  foreach ($arr as $value) {
   if ($value['per_id']==$per_id) {
    $value['lv']=$lv;
    $arr2[$i]=$value;
    $i++;
    $lv++;
    cate_arr($arr,$arr2,$value['cate_id'],$lv--);
   }
  }
  
  }

}

数据库 分类cate 表中只需要3个基本字段, ('cate_id','per_id','cate_name'),

使用方式:

从数据库表cate)中获取数组$arr  ;
.....

$sql='select * from cate ';
$arr=$db->getall($sql);

cate_arr($arr,$arr2)  //使用cate_arr函数对$arr进行父->子排序, 并把排序后的结果赋值到 $arr2 中.

如果结合 smarty , 可以简单通过下面的演示看到排序后的效果

......
$tpl->assign('catels',$arr2);

$tpl->display('cate.htm');


执行后,页面显示的结果结构如:

a
  a1
     a20 a21
b
   b10  b11

c
   .....

或者按照实际的使用要求,对  $arr2 进行二次处理.

转载请注明作者 和出处,谢谢.

以上adodb +smarty 的例子,

本核心算法,只查询一次数据库, 并且只要3个字段名, 即可实现 父->子 排序 和 层次,

比现有很多php web 软件项目中使用的无限分类的实现方法 执行要快些.
阅读(1515) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~