• 一道无限极类 PHP 试题


    记某次笔试碰到的一道无限极类试题,当时时间比较紧(满满六页试题),还是手写代码,所以最终写的有点错误。记不住原题了,但是要求都知道,特此记录下来!

    试题

    有下面一个数组:

    $arr = [
        '小红' => [
            '张三' => null,
            '李四' => [
                '东东' => [
                    '一一' => null,
                    '二二' => [
                        '小明' => null
                    ]
                ],
                '西西' => null,
            ],
        ],
        '小绿' => [
            '王五' => null,
            '赵六' => [
                '南南' => null,
            ],
            '孙七' => [
                '北北' => null
            ]
        ],
        '小蓝' => null
    ];
    

    请补充函数 function getUserStr($arr) {} ,使之结果输出为:

    小红: 张三,李四,东东,西西,一一,二二,小明
    张三: 无
    李四: 东东,西西,一一,二二,小明
    东东: 一一,二二,小明
    一一: 无
    二二: 小明
    小明: 无
    西西: 无
    小绿: 王五,赵六,孙七,南南,北北
    王五: 无
    赵六: 南南
    南南: 无
    孙七: 北北
    北北: 无
    小蓝: 无
    

    答案

    function getUserStr($arr) {
    
        // 将多级上下级关系转为二维
        function getList($arr, &$data=[], $key='') {
            if ($key && !array_key_exists($key, $data)) $data[$key] = [];
            if (is_array($arr)) foreach ($arr as $k => $v) {
                if ($key) $data[$key][] = $k;
                getList($v, $data, $k);
            }
            return $data;
        }
        $list = getList($arr);
    
        // 上下级关系对应处理
        function getUserSubordinate($list, &$res, $pk, $ck) {
            $res[$pk] = array_merge($res[$pk], $list[$ck]);
            foreach ($list[$ck] as $key => $value) {
                if (array_key_exists($value, $list) && count($list[$value])) {
                    getUserSubordinate($list, $res, $pk, $value);
                }
            }
        }
        $res  = [];
        foreach ($list as $key => $value) {
            $res[$key] = $value;
            foreach ($value as $ck => $cv) {
                if (array_key_exists($cv, $list) && count($list[$cv])) {
                    getUserSubordinate($list, $res, $key, $cv);
                }
            }
        }
    
        // 拼接字符串
        $str = '';
        foreach ($res as $key => $value) {
            $str .= $key . ': ' . ($value ? implode(',', $value) : '无') . '<br>';
        }
        return $str;
    }
    

    用了两次递归,最终输出结果没有问题,但是总感觉应该有比较简便的方法。留着以后改进吧!!|・ω・`)

  • 相关阅读:
    js图片加载效果(延迟加载+瀑布流加载)
    iOS仿支付宝芝麻信用仪表盘效果
    Spark GraphX 的数据可视化
    [Animations] 快速上手 iOS10 属性动画
    iOS蓝牙BLE4.0通信功能
    微信小程序项目实战之天气预报
    Android利用温度传感器实现带动画效果的电子温度计
    Eclipse集成ijkplayer并实现本地和网络视频播放等
    Android HandlerThread详解
    AsyncTask 异步任务基本使用-下载视频
  • 原文地址:https://www.cnblogs.com/bndong/p/12762990.html
Copyright © 2020-2023  润新知