php无限分类算法,PHP无限分类树算法相关

数据表务必要的3字段:

1、id:自增ID

2、pid:父ID

3、title:名称

一、找儿子

1、引用算法找儿子

/**

* 创建子节点树形数组

* 参数

* $ar 数组,邻接列表方式组织的数据

* $id 数组中作为主键的下标或关联键名

* $pid 数组中作为父键的下标或关联键名

* 返回 多维数组

**/

function find_child($ar, $id='id', $pid='pid') {

foreach($ar as $v) $t[$v[$id]] = $v;

foreach ($t as $k => $item){

if( $item[$pid] ) {

$t[$item[$pid]]['child'][$item[$id]] =& $t[$k];

}

}

return $t;

}

2、

3、

二、找父母

1、根据下面3的方法改进的迭代算法找父母(效率非常高的无限分类找父母的算法)

/**

* 找父母(迭代算法)

*

* 非常快的算法,仅可用于找父母(单支线,找儿子是多支线)

* 用途:面包屑导航

*

* @param array $arr 数据列表

* @param int $id

* @param string $id_field id字段名称

* @param string $pid_field fid字段名称

* @return array

* @author: 

*/

function get_parents($arr, $id, $id_field = 'id', $pid_field = 'pid') {

if (empty($arr)) return array();

//如果$arr数组不是以id值作为健名,则重组以id值做为键名的数组

if (isset($arr[0]) && !empty($arr[0])) {

$_arr = array();

foreach ($arr as $val) {

$_arr[$val[$id_field]] = $val;

}

$arr = &$_arr;

}

$return = array();

while ($id != 0) {

$return[$id] = $arr[$id];

$id = $arr[$id][$pid_field];

}

return $return;

}

2、递归算法找父母

/**

* 找父母(递归算法)

*

* 可用于面包屑导航

*

* @param array $arr 数据列表

* @param int $id

* @param string $id_field id字段名称

* @param string $pid_field fid字段名称

* @return array

*/

public static function get_parents_by_recursion($arr, $id, $id_field = 'id', $pid_field = 'pid') {

static $return = array();

foreach ($arr as $key => $val) {

if ($val[$id_field] == $id) {

unset($arr[$key]);

//只要这个元素的parent不为0,表明它还有上一层父元素,则继续找

if ($val[$pid_field] != 0) {

self::get_parents_by_recursion($arr, $val[$pid_field], $id_field, $pid_field);

}

$return[] = $val;

}

}

return $return;

}

3、一般迭代算法找父母

function findjiapu2($area,$id){

$row=array();

while($id!=0){//只要id不为0就找家谱

foreach($area as $v){

if($v['id']==$id){//找到id为8的那条记录

$row[]=$v;//找到的记录加到数组中

$id=$v['parent'];//赋值id=2(因为id为8的parent为2)  ,作为下次foreach所用

break;//跳出foreach循环,进行下个id(2)的查询

}

}

}

return $row;

}

4、引用算法找父母

/**

* 创建父节点树形数组

* 参数

* $ar 数组,邻接列表方式组织的数据

* $id 数组中作为主键的下标或关联键名

* $pid 数组中作为父键的下标或关联键名

* 返回 多维数组

**/

function find_parent($ar, $id='id', $pid='pid') {

foreach($ar as $v) $t[$v[$id]] = $v;

foreach ($t as $k => $item){

if( $item[$pid] ){

if( ! isset($t[$item[$pid]]['parent'][$item[$pid]]) )

$t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]];

}

}

return $t;

}

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值