一道无限级分类题的 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;
}

输出:

时间: 2024-10-23 09:08:11

一道无限级分类题的 PHP 实现的相关文章

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

相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径.各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了. 什么是无限级分类? 无限级分类是一种分类技巧,例如部门组织,文章分类,学科分类等常用到无限级分类,将其简单理解成分类就好了.其实我们仔细想一下,生活中的分类简直太多了,衣服可以分为男装和女装,也可以分为上衣和裤子,也可以根据年龄段分类.分类无处不在,分类显得“无限”.我这里就不说无限分类的必要性了. 无限级分类原理简介 无限分类看

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

在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据. 首先

Nim Game,一个有趣的游戏,也是一道入门算法题。

Nim Game,其实很多人都玩过.其实就是我们玩的划线游戏. 一张纸上,画若干条线,双方一人划一次,每次划掉1~3条线.可以选择画1条,也可以划2条,也可以3条.具体划去几条线完全看自己的策略.谁划掉最后一条线,就是赢家. 如上图,蓝方获胜. 正在看这篇文章的你一定是一个聪明人,每一步都是最优解,而你的对手,也跟你一样聪明,每步都是最优的解法. 现在你作为先手,在线条总数为多少的时候,你必赢呢,又在多少的时候必输呢? 可不可以用一个函数来判断在线条总是为x时你的输赢情况呢?这样你以后跟别人玩这

mysql 无限级分类实现思路

第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类. 这种算法的数据库结构设计最为简单.category表中一个字段id,一个字段fid(父id).这样可以根据WHERE id = fid来判断上一级内容,运用递归至最顶层. 分析:通过这种数据库设计出的无限级,可以说读取的时候相当费劲,所以大部分的程序最多3-4级分类,这就足以满足需求,从而一次性读出所有的数据,再对得到数组或者对象进行递归.本身负荷还是没太大问题.但是如果分类到更多级,那是不可

夺命雷公狗---无限级分类NO2

<?php header("Content-Type:text/html;charset=utf-8"); /* 无限级分类.牵扯2个应用 0是-找指定栏目的子栏目 1是-找指定栏目的子孙栏目,即子孙树 2是-找指定栏目的父栏目/父父栏目....顶级栏目,即家谱树 */ $aarr = array( array('id'=>1,'name'=>'安徽','pid'=>0), array('id'=>2,'name'=>'海淀','pid'=>7

夺命雷公狗---无限级分类NO3

<?php header("Content-Type:text/html;charset=utf-8"); /* 无限级分类.牵扯2个应用 0是-找指定栏目的子栏目 1是-找指定栏目的子孙栏目,即子孙树 2是-找指定栏目的父栏目/父父栏目....顶级栏目,即家谱树 */ $aarr = array( array('id'=>1,'name'=>'安徽','pid'=>0), array('id'=>2,'name'=>'海淀','pid'=>7

无限级分类功能实践

在一般的web开发中,无论是一般的企业建站,内部OA,电商,无限级分类都是一种很常见的功能. 实现该业务常见有三种(本人已知)方式,分别有其不同的优缺点,一般最常用是第一种,接下来分别简单介绍其数据结构和大体实现. 第一种: 表结构 字段 类型 主键 id int 是 parent_id int 否 value varchar 否 CREATE TABLE `NewTable` ( `id` int UNSIGNED NOT NULL , `parent_id` int UNSIGNED NOT

无限级分类

$area = array( array('id'=>1,'name'=>'安徽','parent'=>0), array('id'=>2,'name'=>'海淀','parent'=>7), array('id'=>3,'name'=>'濉溪县','parent'=>5), array('id'=>4,'name'=>'昌平','parent'=>7), array('id'=>5,'name'=>'淮北','paren

php无限级分类实战——评论及回复功能

经常在各大论坛或新闻板块详情页面下边看到评论功能,当然不单单是直接发表评论内容那么简单, 可以对别人的评论进行回复,别人又可以对你的回复再次评论或回复,如此反复,理论上可以说是 没有休止,从技术角度分析很容易想到运用无限级分类技术存储数据,运用递归获取评论层级结构 数据,运用ajax实现评论页面交互,这里用thinkphp框架做个简单的demo练练手,为了简化流程 这里第三级评论不再提供回复功能,当然只要在这个基础上稍作修改就可以实现无限回复功能,主 要是view层样式修改较麻烦,需花些时间.