文档章节

PHP无限分类树算法相关

lixiaokai2008
 lixiaokai2008
发布于 2014/12/06 09:36
字数 691
阅读 551
收藏 19

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

© 著作权归作者所有

lixiaokai2008
粉丝 14
博文 100
码字总数 20933
作品 0
中山
私信 提问
加载中

评论(2)

lixiaokai2008
lixiaokai2008 博主

引用来自“言会咸”的评论

有结合数据库的实例吗?给个参考吧,谢谢
数据表务必要的3字段: 1、id:自增ID 2、pid:父ID 3、title:名称 时间匆匆,以后补上吧
言会咸
言会咸
有结合数据库的实例吗?给个参考吧,谢谢
PHP递归计算法问题

@童学芬 你好,想跟你请教个问题:看了你的无限分类数据格式化成树 这算法,很不错,我这里有个问题,可能对你来说很简单,希望指教一下。 我有个程序,需要无限分类: 如: 国家->省->市->县...

2012/06/29
134
3
PHP树形结构--PHPTree

在开发中经常需要用到树形数据,比如无限多级分类,就是典型的树形结构。这里面的算法,用到了递归思想,为了简化开发过程,我编写了一个工具来提升开发效率,它就是PHPTree。使用PHPTree,可...

crazymus
2015/08/12
3.1K
0
关于递归的计算(PHP)

你好,想跟你请教个问题:看了你的无限分类数据格式化成树 这算法,很不错,我这里有个问题,可能对你来说很简单,希望指教一下。 我有个程序,需要无限分类: 如: 国家->省->市->县->镇->村...

2012/07/11
409
5
php利用多叉树(平衡树)的方式构建无限分类

说起无限分类..大多数的结构都是 id name parent_id 这种模式.整个结构比较简单清晰.要构建和更新整个分类也比较容易.但是查询起来就会非常的麻烦.经常会用到递归的算法.例如 获取某个节点的...

酒逍遥
2013/07/26
1K
0
PHPTree 1.1 发布,PHP 树形结构生成库

PHPTree 是一个优雅而简洁的树形结构生成库,帮助 PHP程 序员快速生成树形结构,可以和 zTree、ExtJS 等前端框架整合使用。树形结构在软件开发中非常普遍,典型的应用就是无限多级分类,经验...

crazymus
2015/08/18
3.4K
5

没有更多内容

加载失败,请刷新页面

加载更多

centos 查看删除旧内核

1、查看系统中安装的内核 $ yum list installed | grep kernel 2、删除系统中旧内核 $ yum install yum-utils$ package-cleanup --oldkernels --count=2...

编程老陆
6分钟前
0
0
ES6

ES6:不改变原理的基础上,让API变得更简单 一、let:代替var用于声明变量 1、var的缺点: (1)声明提前 (2)没有块级作用域 2、let的优点: (1)组织了申明提前 (2)让let所在的块({}),...

wytao1995
今天
3
0
kubernetes 环境搭建 —— minikube

创建集群 minikube start 搭建好 k8s 集群后,可以查看集群的状态以及部署应用。主要用到的是 k8s 的 api,这通常需借助于 kutectl 命令行工具 基本操作 kubectl versionkubectl cluster-i...

lemos
今天
9
0
关于js混淆与反混淆还原操作

使用js的混淆加密,其目的是为了保护我们的前端代码逻辑,对应一些搞技术吃饭的公司来说,为了防止被竞争对手抓取或使用自己的代码,就会考虑如何加密,或者混淆js来达到代码保护。 1、为什么...

开源oschina
今天
11
0
用盛金公式解三次方程(ansi c版)

/* cc cubic.c -lm gcc cubic.c -lm Shengjin's Formulas Univariate cubic equation aX ^ 3 + bX ^ 2 + cX + d = 0, (a, b, c, d < R, and a!= 0). Multiple root disc......

wangxuwei
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部