今天有网友出了道题:

给出如下的父子结构(你可以用你所用语言的类似结构来描述,第一列是父,第二列是子),将其梳理成类似如图的层次父子结构。
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 实现的更多相关文章

  1. PHP无限级分类的实现(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构.文章分类.无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在 ...

  2. (实用篇)PHP递归实现无限级分类

    在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信 ...

  3. php利用递归函数实现无限级分类

    相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径.各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了. 什么是无限级分类? 无限级分类是 ...

  4. PHP+MySQL无限级分类(非递归)

    要实现无限级分类,递归一般是第一个也是最容易想到的,但是递归一般被认为占用资源的方法,所以很多系统是不考虑使用递归的 本文还是通过数据库的设计,用一句sql语句实现 数据库字段大概如下: 字段 说明 ...

  5. PHP无限级分类-递归(不推荐)

    [http://www.helloweba.com/view-blog-204.html] 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢? ...

  6. PHP无限级分类生成树实例代码

    分享一例php无限级分类生成树的代码,学习下php无限级分类的实现方法,有需要的朋友参考下.   一段非常精简的PHP无限极分类生成树方法,巧在引用.   例子,php实现无限级分类.   代码示例: ...

  7. php非递归无限级分类.

    项目需要.递归无限级分类效率实在太低.理了半天思路写的. 分类越多效率越高. /** * 单次循环返回无限极分类嵌套 * @param array $data 操作的数组 * @param strin ...

  8. 转:php+mysql菜单无限级分类(非递归)

    php+mysql无限级分类(非递归) 参考:http://www.chhua.com/web-note3244

  9. SQL 无限级分类语句

    原文:SQL 无限级分类语句 原表数据为: 此处用到了with关键字,在程序中也可以用递归实现,但觉得还是没有一条sql方便 with tb (ID,Name,ParentID,Sort) as( s ...

随机推荐

  1. 用vuejs实现一个todolist项目

    用vue.js实现一个todolist项目:input输入框输入的值会呈现在下方,并且会保存在localStorage里面,而且下方的列表点击之后也会有变化: 完整代码: App.vue <te ...

  2. asp:DataGrid之添加asp:CheckBox做全选功能时涉及到绑值问题解决

    最大的意图是为asp:CheckBox的value绑定上自己需要的value值,而不是默认的字符串"on" 参考了这篇文章带Value属性的扩展CheckBox控件,意义不大,换了 ...

  3. jquery 赋值文本框输入框

    jQuery("#mrId option[value='" + extValue + "']").attr("selected", true ...

  4. gbk和gb2312的区别

    //GB2312是中国规定的汉字编码,也可以说是简体中文的字符集编码;GBK 是 GB2312的扩展 ,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名 //总体说来,GBK包括所有的汉字, ...

  5. Java 集合类 TreeSet、TreeMap

    TreeMap和TreeSet的异同: 相同点: TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是拍好序的. TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之 ...

  6. iOS开发多线程篇 — GCD的常见用法

    一.延迟执行 1.介绍    iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) withObject:nil ...

  7. union和union all 合并查询

    union联合查询 SELECT TOP ID,oTitle Title,oInfo Description,Pic Images AND UpTime > dateadd(day,-,UpTi ...

  8. hdu 1502 Regular Words

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1502 思路:给定一个n,分别由n个a,b,c组成的字符串的所有前缀中a的个数大于等于b的个数大于等于c的个 ...

  9. Git Push 避免用户名和密码方法

    参考这里: http://www.cnblogs.com/ballwql/p/3462104.html 亲测第一种方法有效

  10. ios10新特性-UserNotification

    引言:iOS的通知分本地通知和远程通知,iOS10之前采用的是UILocationNotification类,远程通知有苹果服务器进行转发,本地通知和远程通知其回调的处理都是通过AppDelegate ...