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

    输出:

  • 相关阅读:
    MTK 官方 openwrt SDK 使用
    PF_RING packet overwrites
    pycares cffi
    libevent evbuffer bug
    浮点转字符串性能比较
    重写 libev 的 EV_WIN32_HANDLE_TO_FD
    thrift TNonblockingServer 使用
    accel-pptp 部署
    boost::asio 使用 libcurl
    蜂鸟A20开发板刷 cubietruck 的 SD 卡固件
  • 原文地址:https://www.cnblogs.com/dee0912/p/5793785.html
Copyright © 2020-2023  润新知