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: <[email protected]>
 */
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

你可能感兴趣的:(无限分类,分类树)