无限极 php算法,无限极分类算法,对你一定有帮助

a336c592a49c65519186b087e8d83557.png

无限级分类是开发中常见的情况,也经常会在面试,主考官问到,笔试中遇到,因此本文对常见的无限极分类算法进行总结归纳,其实大多数就是迭代与递归。

1.循环迭代实现

$arr = [

1=>['id'=>1,'name'=>'父1','father'=>NULL],

2=>['id'=>2,'name'=>'父2','father'=>NULL],

3=>['id'=>3,'name'=>'父3','father'=>NULL],

4=>['id'=>4,'name'=>'儿1-1','father'=>1],

5=>['id'=>5,'name'=>'儿1-2','father'=>1],

6=>['id'=>6,'name'=>'儿1-3','father'=>1],

7=>['id'=>7,'name'=>'儿2-1','father'=>2],

8=>['id'=>8,'name'=>'儿2-1','father'=>2],

9=>['id'=>9,'name'=>'儿3-1','father'=>3],

10=>['id'=>10,'name'=>'儿3-1-1','father'=>9],

11=>['id'=>11,'name'=>'儿1-1-1','father'=>4],

12=>['id'=>12,'name'=>'儿2-1-1','father'=>7],

];

function generateTree($items){

$tree = array();

foreach($items as $item){

if(isset($items[$item['father']])){

$items[$item['father']]['son'][] = &$items[$item['id']];

}else{

$tree[] = &$items[$item['id']];

}

}

return $tree;

}

$tree = generateTree($arr);

print_r(json_encode($tree));

输出:

12aba866b0045cc728fd82dd4ac8bedf.png

分析:

这个算法利用了循环迭代,将线性结构按照父子关系以树形结构输出,算法的关键在于使用了引用.

优点:速度快,效率高.

缺点:数组的key值必须与id值相同,不便于取出数据(同样使用迭代获取数据)

2.递归实现

$arr = [

0=>['id'=>1,'name'=>'父1','father'=>0],

1=>['id'=>2,'name'=>'父2','father'=>0],

2=>['id'=>3,'name'=>'父3','father'=>0],

3=>['id'=>4,'name'=>'儿1-1','father'=>1],

4=>['id'=>5,'name'=>'儿1-2','father'=>1],

5=>['id'=>6,'name'=>'儿1-3','father'=>1],

6=>['id'=>7,'name'=>'儿2-1','father'=>2],

7=>['id'=>8,'name'=>'儿2-1','father'=>2],

8=>['id'=>9,'name'=>'儿3-1','father'=>3],

9=>['id'=>10,'name'=>'儿3-1-1','father'=>9],

10=>['id'=>11,'name'=>'儿1-1-1','father'=>4],

11=>['id'=>12,'name'=>'儿2-1-1','father'=>7],

];

function generateTree($arr,$id,$step){

static $tree=[];

foreach($arr as $key=>$val) {

if($val['father'] == $id) {

$flg = str_repeat('└―',$step);

$val['name'] = $flg.$val['name'];

$tree[] = $val;

generateTree($arr , $val['id'] ,$step+1);

}

}

return $tree;

}

$tree = generateTree($arr,0,0);

foreach ($tree as $val){

echo $val['name'].'
';

}

输出

d75919e3c3ddd6d9b648839d21b8e381.png

分析:

利用了递归,数组的key值与id值可以不相同,最后以顺序的结构输出数组

优点:方便遍历,查找父子元素

缺点:php不擅长递归,数据量大的情况下效率会显著降低

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查看队列深度_不为人知的网络编程(十一):从底层入手,深度分析TCP连接耗时的秘密...

“ 本文作者张彦飞,原题“聊聊TCP连接耗时的那些事儿”,本次收录已征得作者同意,转载请联系作者。即时通讯网收录时有少许改动。本文已同步发布于52im社区:http://www.52im.net/thread-3265-1-1.html(1、引言对于基于互联网的通信…

几级工作台做石头高墙_创造与魔法:建筑新手入门攻略,家园建材怎么做

hello大家好,又见面啦,我是创造与魔法郁金香建筑团的建筑师,九梨梨众所周知,我是一个热衷于出各类建筑案例的人,玩创魔两年多,做了好几十个不同款式的家园吧。其实创魔这个游戏,建筑只是其中一个…

oracle vitu,Supply Chain Management (SCM) a Manufacturing | Oracle Česká Republika

Nebyly nalezeny ždn vsledkyVašemu vyhledvn neodpovdaj ždn vsledky.Abyste našli to, co hledte, doporučujeme vyzkoušet nsledujc postup:Zkontrolujte pravopis vašich klčovch slov ve vyhledvn.Použijte synonyma pro klčov slovo, kter jste zadali, napřk…

两步路轨迹文件位置_最新Uber ATG的轨迹预测方法LiRaNet介绍

arXiv今年10月刚刚上传论文“LiRaNet: End-to-End Trajectory Prediction using Spatio-Temporal Radar Fusion“。其特色在于,除了激光雷达和HD Map之外,该轨迹预测方法采用了雷达传感器的信息。雷达和激光雷达融合是有挑战性的,因为前者的低…

linux查看目录下 开头,Linux下ls如何看到.开头的文件

Linux下ls查看到.开头的文件方法:ls -aLinux操作系统是UNIX操作系统的一种克隆系统,它诞生于1991 年的10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界…

增值电信服务费是什么意思_增值电信业务IDC许可证要年检吗,流程是什么

据国家相关法律法规,持有IDC许可证的企业每年年初都需要办理IDC年检,企业也应当重视IDC年检,否则将会面临惩罚,所以小编来给大家介绍云南IDC许可证年检流程。为什么要办理云南IDC许可证年检,如何办理?根据《中华人民共和国电信条…

linux查看进程调用接口,查看某个程序都调用哪些api函数

查看某个程序都调用哪些api函数以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!查看某个程序都调用哪些api函数vs6里带了个工具叫depends可以看反汇编软件w32dasm也可以希望能帮到你windows编…

linux生产上线工具,Linux 产能工具及其使用技巧

由于生产力本身是一个主观术语,我不打算详细解释我这里要讲到的“生产力”是什么。我打算给你们展示一些工具及其使用技巧,希望这会帮助你在Linux中工作时能更专注、更高效,并且能节省时间。Linux产能工具及其使用技巧再次说明,我…

现代汉语词典第五版_从现代汉语词典“哀兵必胜”词条说起

本文属本公众号原创。想转发可以后台留言,别洗我们的稿!最近,编校一姐一直在研读《现代汉语词典》(第7版),将会陆续发布学习心得。今天,说一说“哀兵必胜”词条。第一版第五版第六版第七版故抗兵相若(加),(…

linux通讯录软件带头像,小程序新技能 Get!保存微信好友头像到手机通讯录

原标题:小程序新技能 Get!保存微信好友头像到手机通讯录亲爱的朋友,你知道来电时能看到好友的头像是一种怎样的体验吗?你是否注意过这样一件事:每当打开自己的微博、微信等社交软件,除了扑面而来的信息流之…

linux vmware硬盘,给vmware的Linux虚拟机增添硬盘

给vmware的Linux虚拟机添加硬盘1、先将虚拟机Power Off,在Virtual Machine Setting对话框里点击左下角的“Add”,选择“Hard Disk”,之后选择“Create a new virtual disk”,分配容量,其他默认配置就可以了。2、启动虚…

linux常用调试,linux下gdb常用的调试命令

用gdb调试程序时,常常很困惑一些命令的使用,要么是不知道这个命令,要么忘了命令的使用方法。接下来是小编为大家收集的linux下gdb常用的调试命令,希望能帮到大家。linux下gdb常用的调试命令gdb常用:run 启动程序运行ne…

linux vg备份还原,Oracle Linux 6.4 误删VG之恢复过程

五、VG恢复思路1、在/etc/lvm/存放着LVM的配置、归档、备份等信息。[rootol64 ~]# ls -l /etc/lvmtotal 52drwx------. 2 root root 4096 Nov 18 08:30 archivedrwx------. 2 root root 4096 Nov 18 08:30 backupdrwx------. 2 root root 4096 Feb 24 2013 cache-rw-r--r--. 1 …

linux cat cd,linux 文件系统命令 cat cd chmod

cd,有时也写作chdir(change directory,改变目录),是在Unix、Windows和DOS操作系统下用于改变工作目录的命令行命令。在Unix的外壳脚本与Windows或DOS的批处理文件中亦可使用。CHDIR()还是Visual Basic改变工作目录的一个函数。目录是文件系统…

数据结构c语言版编程软件,数据结构严蔚敏4版PDF下载_数据结构C语言版严蔚敏下载 完整版_当载软件站...

数据结构C语言版严蔚敏 是《data structures and algorithm analysis in c》一书第2版的简体中译本。原书曾被评为20世纪顶尖的30部计算机著作之一,作者mark allen weiss在数据结构和算法分析方面卓有建树,他的数据结构和算法分析的著作尤其畅销&#xf…

android网络盒子改,有什么办法可以把淘汰下来的安卓手机改造成电视盒子用?...

基本上谁家都会有一两部旧的手机,其实并不是不能用或者坏了,只是配置有些低。我们只需要简单改造一下,就可以将旧手机改造成电视盒子,而且比普通的网络盒子性能更强大。有线方式我们需要准备一根MHL线,大部分的安卓手机…

android palette组件用法,Android Support Palette使用详解

使用Palette API选择颜色良好的视觉设计是app成功所必不可少的, 而色彩设计体系是设计的基础构成. Palette包是支持包, 能够从图片中解析出突出的颜色, 从而帮助你创建出视觉迷人的应用你能够使用Palette包设计布局主题, 并把自定义色彩应用到可视化元素中. 比如, 你可以根据专…

android ui stencil kit 下载,实用的iOS6/iPhone5 GUI/iPad PSD以及其它版本素材

实用的iOS6/iPhone5 GUI/iPad PSD以及其它版本素材10月 16, 2012评论 (1)Sponsor现在使用Apple旗下产品越来越多,比如iPhoneiPad等,正因如此,我们需要设计这类的apps应用也相对多了,所以如果有一些现用素材的话可以帮助设计师快速…

android下拉弹性gif,android-pulltorefresh 下拉加载中使用gif动图

效果预览:xml布局xmlns:ptr"http://schemas.android.com/apk/res-auto"android:layout_width"fill_parent"android:layout_height"fill_parent"android:divider"#00000000"android:cacheColorHint"#00000000"and…

unity3d android aar,Android Stuido导出AAR 给Unity3D调用注意事项

1. 导出 AAR过程需要注意,依赖的文件并没有打进去,所以要收到拷入到 Unity项目中,如下图中的 support包,是我项目中要用到的:2.删除aar包中重复的 libs下的 jar文件和 jni下的 .so文件,否则调用的时候会报…