一道无限级分类题的 PHP 实现
今天有网友出了道题:
给出如下的父子结构(你可以用你所用语言的类似结构来描述,第一列是父,第二列是子),将其梳理成类似如图的层次父子结构。
origin = [('A112', 'A1122'),
('A', 'A1'),
('A', 'A2'),
('A1', 'A11'),
('A2', 'A21'),
('A2', 'A22'),
('A', 'A3'),
('A22', 'A221'),
('A11', 'A111'),
('A21', 'A211'),
('A11', 'A112'),
('A21', 'A212'),
('A11', 'A113'),
('A112', 'A1121'),
('A3', 'A31'),
('A31', 'A311'),
('A22', 'A222'),
('A31', 'A312'),
('A31', 'A313'),
('A311', 'A3111'),
('A312', 'A3121'),
('A3111', 'A31111')]
输出结果:

看了一下是无限级分类的原理,可以用递归来实现:
<?php
$origin = [
['A112', 'A1122'],
['A', 'A1'],
['A', 'A2'],
['A1', 'A11'],
['A2', 'A21'],
['A2', 'A22'],
['A', 'A3'],
['A22', 'A221'],
['A11', 'A111'],
['A21', 'A211'],
['A11', 'A112'],
['A21', 'A212'],
['A11', 'A113'],
['A112', 'A1121'],
['A3', 'A31'],
['A31', 'A311'],
['A22', 'A222'],
['A31', 'A312'],
['A31', 'A313'],
['A311', 'A3111'],
['A312', 'A3121'],
['A3111', 'A31111']
]; // 根据父id找出子信息
function level($cate, $html = '-', $pid = '0', $level = 0) {
$arr = array();
foreach($cate as $val) {
if($val[0] == $pid) {
$val['level'] = $level + 1;
$val['html'] = str_repeat($html, $level);
$arr[] = $val;
$arr = array_merge($arr, level($cate, $html, $val[1], $level + 1));
}
}
return $arr;
} // 构建顶级分类
$pids = [];
$cids = [];
foreach($origin as $val) {
$pids[] = $val[0];
$cids[] = $val[1];
}
$top = array_flip(array_diff($pids, $cids));
foreach($top as $key => $val) {
$origin[] = ['0', $key];
} $res = level($origin, ' ');
foreach($res as $k => $v) {
echo $v['html'],$v[1],PHP_EOL;
}
输出:

一道无限级分类题的 PHP 实现的更多相关文章
- PHP无限级分类的实现(不使用递归)
无限级分类在开发中经常使用,例如:部门结构.文章分类.无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在 ...
- (实用篇)PHP递归实现无限级分类
在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信 ...
- php利用递归函数实现无限级分类
相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径.各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了. 什么是无限级分类? 无限级分类是 ...
- PHP+MySQL无限级分类(非递归)
要实现无限级分类,递归一般是第一个也是最容易想到的,但是递归一般被认为占用资源的方法,所以很多系统是不考虑使用递归的 本文还是通过数据库的设计,用一句sql语句实现 数据库字段大概如下: 字段 说明 ...
- PHP无限级分类-递归(不推荐)
[http://www.helloweba.com/view-blog-204.html] 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢? ...
- PHP无限级分类生成树实例代码
分享一例php无限级分类生成树的代码,学习下php无限级分类的实现方法,有需要的朋友参考下. 一段非常精简的PHP无限极分类生成树方法,巧在引用. 例子,php实现无限级分类. 代码示例: ...
- php非递归无限级分类.
项目需要.递归无限级分类效率实在太低.理了半天思路写的. 分类越多效率越高. /** * 单次循环返回无限极分类嵌套 * @param array $data 操作的数组 * @param strin ...
- 转:php+mysql菜单无限级分类(非递归)
php+mysql无限级分类(非递归) 参考:http://www.chhua.com/web-note3244
- SQL 无限级分类语句
原文:SQL 无限级分类语句 原表数据为: 此处用到了with关键字,在程序中也可以用递归实现,但觉得还是没有一条sql方便 with tb (ID,Name,ParentID,Sort) as( s ...
随机推荐
- iOS开发——高级篇——iOS中常见的设计模式(MVC/单例/委托/观察者)
关于设计模式这个问题,在网上也找过一些资料,下面是我自己总结的,分享给大家 如果你刚接触设计模式,我们有好消息告诉你!首先,多亏了Cocoa的构建方式,你已经使用了许多的设计模式以及被鼓励的最佳实践. ...
- samtools常用命令详解
samtools的说明文档:http://samtools.sourceforge.net/samtools.shtmlsamtools是一个用于操作sam和bam文件的工具合集.包含有许多命令.以下 ...
- mapReduce编程之Recommender System
1 协同过滤算法 协同过滤算法是现在推荐系统的一种常用算法.分为user-CF和item-CF. 本文的电影推荐系统使用的是item-CF,主要是由于用户数远远大于电影数,构建矩阵的代价更小:另外,电 ...
- python %s深入解析
默认我们通常用字符串填充它 'Keep %s, and you will aways make %' % ('moving', 'it') 如果你就此止步,那就错过了一些神乎其技的用法 比如: arr ...
- 批处理命令——call 和 start
一.call命令总结 [1]call命令简介 学过汇编或C的朋友,肯定都知道call指令表示什么意思.其实,在这里它的意思也是一样的.在批处理脚本中,call命令用来从一个批处理脚本中调用另一个批处理 ...
- 利用Photos 框架搭建美图秀秀相册选择器
简介:Photos框架是iOS8.0后推出的一个新的用于对系统相册进行相关操作的,在iOS8.0之前,开发中只能使用AssetsLibrary框架来访问移动设备的图片库.本文中不再对AssetsLib ...
- AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(四):开源的Silverlight运行容器的编译、配置
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- uboot的编译
在我拿到开发板以后,uboot都是编译好的,但是我不知道它是如何生成uboot.bin文件的.经过一番摸索.我也会编译uboot了. #cd /home #mkdir study //创建工作目录 * ...
- java web.xml配置详解
1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...
- 验证启用了不安全的HTTP方法
安全风险: 可能会在Web 服务器上上载.修改或删除Web 页面.脚本和文件. 可能原因: Web 服务器或应用程序服务器是以不安全的方式配置的. 修订建议: 如果 ...