php 无限分类 核心算法
时间:2007-01-14 来源:yueming
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 软件项目中使用的无限分类的实现方法 执行要快些.
请看下面的 核心算法(如果您在你的项目中使用本核心算法,请您注明)
/*
说明:
$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 软件项目中使用的无限分类的实现方法 执行要快些.
相关阅读 更多 +
排行榜 更多 +