文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

php 实现无限极分类树 (引用和递归)

2023-09-01 06:48

关注

这里首先介绍一下,什么是无限极分类?

无限极分类简单点说就是一个类可以分成多个子类,然后一个子类又可以分另外多个子类这样无限分下去,就好象windows可以新建一个文件夹,然后在这个文件夹里又可以建一些个文件夹,在文件夹底下还可以建一些文件夹一样

示例如图:

PHP又是如何实现它的无限分类的呢?如何把它的各个分类一一列出来呢?

方法一、递归思想

PHP大部分人用递归来写生成树,不过PHP默认最多递归次数为100,并不是理论上的无限,其次递归的内存占有过大,php的内存分配是除了对象,其余的为直接copy内存,所以有时候会导致内存占用过大

 public function generateTree($items , $pId)    {        $tree = [];        foreach($items as $k => $v)        {            if($v['pid'] == $pId)            {                if (!empty($this->generateTree($items , $v['id'])))                    {                        $v['childs'] = $this->generateTree($items , $v['id']);              }                $tree[] = $v;            }        }        return $tree;    }generateTree($array,0);

缺点: 一旦数据量大,耗时非常长,影响性能.

二、引用思想

// 例子:$arr=array(        array('id'=>'1','name'=>'北京','pid'=>'0'),        array('id'=>'2','name'=>'上海','pid'=>'0'),        array('id'=>'3','name'=>'浦东','pid'=>'2'),        array('id'=>'4','name'=>'朝阳','pid'=>'1'),        array('id'=>'5','name'=>'广州','pid'=>'0'),        array('id'=>'6','name'=>'三里屯','pid'=>'4'),       array('id'=>'7','name'=>'广东','pid'=>'5'),       array('id'=>'8','name'=>'三里','pid'=>'4'),      array('id'=>'10','name'=>'小胡同','pid'=>'8')      );   

 首先 : 利用数组的索引与主键的id号相同来查找子栏目,首先为数组加上索引:

$arr=array(        1=>array('id'=>'1','name'=>'北京','pid'=>'0'),        2=>array('id'=>'2','name'=>'上海','pid'=>'0'),        3=>array('id'=>'3','name'=>'浦东','pid'=>'2'),        4=>array('id'=>'4','name'=>'朝阳','pid'=>'1'),        5=>array('id'=>'5','name'=>'广州','pid'=>'0'),        6=>array('id'=>'6','name'=>'三里屯','pid'=>'4'),       7=>array('id'=>'7','name'=>'广东','pid'=>'5'),       8=>array('id'=>'8','name'=>'三里','pid'=>'4'),      10=>array('id'=>'10','name'=>'小胡同','pid'=>'8')      );   

利用索引的下标,判断该栏目是否存在父栏目,如果存在就把该栏目放到父栏目的son子数组里面 

 function generateTree($items){       $index_items = [];        foreach ($items as $item) {            $index_items[$item['id']] = $item;        }        $tree = array();        foreach($index_items as $item){            //判断是否有数组的索引==            if(isset($index_items[$item['pid']])){     //查找数组里面是否有该分类  如 isset($items[0])  isset($items[1])                $index_items[$item['pid']]['son'][] = &$index_items[$item['id']]; //上面的内容变化,$tree里面的值就变化            }else{                $tree[] = &$index_items[$item['id']];   //把他的地址给了$tree            }        }        return $tree;    }       generateTree($array);

***进阶版:  参数默认可传

function tree(        array $array,        string $first,        string $pid,        string $id,        string $child = 'childs'    ): array {        $tree = [];        foreach ($array as $item) {            $tree[$item[$id]] = $item;        }        foreach ($tree as $item) {            $tree[$item[$pid]][$child][] = &$tree[$item[$id]];        }        return $tree[$first][$child] ?? [];    }    tree($array,'1','pid','id');

参考: php实现无限极分类_叶落无痕的博客-CSDN博客_无限极分类

来源地址:https://blog.csdn.net/harris_lele/article/details/123243012

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯