标签:style blog http io ar color os sp for
一、找儿子
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: <lixiaokai@live.com> */ 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; }
参考:
1、php递归和迭代家谱树(父级地区)http://my.oschina.net/cgphp/blog/91471
2、PHP树-不需要递归 http://www.cnblogs.com/see7di/archive/2012/09/26/2704550.html
标签:style blog http io ar color os sp for
原文地址:http://my.oschina.net/u/205403/blog/353037