• php实现无限极分类


    面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表的时候,增加一个PID字段用来区别自己所属的分类

        $array = array(
            array('id' => 1, 'pid' => 0, 'name' => '河北省'),
            array('id' => 2, 'pid' => 0, 'name' => '北京市'),
            array('id' => 3, 'pid' => 1, 'name' => '邯郸市'),
            array('id' => 4, 'pid' => 2, 'name' => '朝阳区'),
            array('id' => 5, 'pid' => 2, 'name' => '通州区'),
            array('id' => 6, 'pid' => 4, 'name' => '望京'),
            array('id' => 7, 'pid' => 4, 'name' => '酒仙桥'),
            array('id' => 8, 'pid' => 3, 'name' => '永年区'),
            array('id' => 9, 'pid' => 1, 'name' => '武安市'),
        );

    数据在数据库中存储大概是这个样子,怎么实现无限极递归呢,有两种常用的做法,递归和引用算法

    function getTree($arr,$pid=0,$level=0){
            static $list=[];
            foreach($arr as $key => $value){
                if($value['pid'] == $pid){
                    $value['level']=$level;
                    $list[]=$value;
                    unset($arr[$key]);
                    getTree($arr,$value['id'],$level+1);
                }
            }
            return $list;
        }
        $handle_arr = getTree($array);
        print_r($handle_arr);

     打印输出

    foreach($handle_arr as $key => $value){
        echo str_repeat("-", $value['level']).$value['name']."
    ";
    }

     结果

    河北省
    -邯郸市
    --永年区
    -武安市
    北京市
    -朝阳区
    --望京
    --酒仙桥
    -通州区

     引用方式遍历

    <?php
    function getTree($arr){
            $items = array();
            $tree  = array();
            foreach($arr as $key => $value){
                $items[$value['id']]=$value;
            }
    
            foreach($items as $k => $v){
                if(isset($items[$v['pid']])){
                    $items[$v['pid']]['son'][] = &$items[$k];
                }else{
                    $tree[] = &$items[$k];
                }
            }
            print_r($tree);
        }
    
        getTree($array);
    ?>
  • 相关阅读:
    大数运算
    混合背包问题
    多重背包问题(二进制优化)
    完全背包
    01背包问题
    树状数组
    构建之法阅读笔记04
    第一次冲刺个人总结07
    构建之法阅读笔记03
    第一次冲刺个人总结06
  • 原文地址:https://www.cnblogs.com/zh718594493/p/13434446.html
Copyright © 2020-2023  润新知