博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP无限分类树算法相关
阅读量:7088 次
发布时间:2019-06-28

本文共 2613 字,大约阅读时间需要 8 分钟。

hot3.png

数据表务必要的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;}

参考:

1、php递归和迭代家谱树(父级地区)

2、PHP树-不需要递归 

转载于:https://my.oschina.net/u/205403/blog/353037

你可能感兴趣的文章