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

试题

有下面一个数组:

  1. $arr = [
  2. '小红' => [
  3. '张三' => null,
  4. '李四' => [
  5. '东东' => [
  6. '一一' => null,
  7. '二二' => [
  8. '小明' => null
  9. ]
  10. ],
  11. '西西' => null,
  12. ],
  13. ],
  14. '小绿' => [
  15. '王五' => null,
  16. '赵六' => [
  17. '南南' => null,
  18. ],
  19. '孙七' => [
  20. '北北' => null
  21. ]
  22. ],
  23. '小蓝' => null
  24. ];

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

  1. 小红: 张三,李四,东东,西西,一一,二二,小明
  2. 张三:
  3. 李四: 东东,西西,一一,二二,小明
  4. 东东: 一一,二二,小明
  5. 一一:
  6. 二二: 小明
  7. 小明:
  8. 西西:
  9. 小绿: 王五,赵六,孙七,南南,北北
  10. 王五:
  11. 赵六: 南南
  12. 南南:
  13. 孙七: 北北
  14. 北北:
  15. 小蓝:

答案

  1. function getUserStr($arr) {
  2. // 将多级上下级关系转为二维
  3. function getList($arr, &$data=[], $key='') {
  4. if ($key && !array_key_exists($key, $data)) $data[$key] = [];
  5. if (is_array($arr)) foreach ($arr as $k => $v) {
  6. if ($key) $data[$key][] = $k;
  7. getList($v, $data, $k);
  8. }
  9. return $data;
  10. }
  11. $list = getList($arr);
  12. // 上下级关系对应处理
  13. function getUserSubordinate($list, &$res, $pk, $ck) {
  14. $res[$pk] = array_merge($res[$pk], $list[$ck]);
  15. foreach ($list[$ck] as $key => $value) {
  16. if (array_key_exists($value, $list) && count($list[$value])) {
  17. getUserSubordinate($list, $res, $pk, $value);
  18. }
  19. }
  20. }
  21. $res = [];
  22. foreach ($list as $key => $value) {
  23. $res[$key] = $value;
  24. foreach ($value as $ck => $cv) {
  25. if (array_key_exists($cv, $list) && count($list[$cv])) {
  26. getUserSubordinate($list, $res, $key, $cv);
  27. }
  28. }
  29. }
  30. // 拼接字符串
  31. $str = '';
  32. foreach ($res as $key => $value) {
  33. $str .= $key . ': ' . ($value ? implode(',', $value) : '无') . '<br>';
  34. }
  35. return $str;
  36. }

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

一道无限极类 PHP 试题的更多相关文章

  1. 【Android】一道Android OpenGL笔试题

    一道Android OpenGL笔试题 SkySeraph May. 5th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sky ...

  2. 解析js中作用域、闭包——从一道经典的面试题开始

    如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...

  3. 一道SQL的面试题之联想

    一道SQL的面试题之联想 本人工作在一家小型的民营企业,主要从事业务系统的日常维护,二次开发,菜鸟一枚.周五经理准备面试两个开发人员,据简历,都还比较不错,让经理产生了想法,于是准备了一套面试题目,给 ...

  4. 一道简单的面试题,难倒各大 Java 高手!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 最近栈长在我们的<Java技术栈知识星球>上分享的一道 Java 实战面试题,很有意思,现在拿出来和大家分享下, ...

  5. 一道JS addEventListener面试题

    在园里看到一道面试题,<div id="test">Click Here</div> var node=document.getElementById('t ...

  6. 由一道淘宝面试题到False sharing问题

    今天在看淘宝之前的一道面试题目,内容是 在高性能服务器的代码中经常会看到类似这样的代码: typedef union { erts_smp_rwmtx_t rwmtx; byte cache_line ...

  7. Java类与对象初始化的过程(一道经典的面试题)

    本文不再以ClassLoader的视角解释这些问题. 首先,Java代码有个特点,就是成员变量可以在前面的方法中使用,在后面定义.这一特性,很多人说Java了不起,可是为什么呢?Java为何能够这样呢 ...

  8. Linux fork函数具体图解-同一时候分析一道腾讯笔试题

    原创blog.转载请注明出处 头文件: #include<unistd.h> #include<sys/types.h> 函数原型: pid_t fork( void); (p ...

  9. 一道经典JS面试题

    超过80%的候选人对下面这道JS面试题的回答情况连及格都达不到.这究竟是怎样神奇的一道JS面试题?他考察了候选人的哪些能力?对正在读本文的你有什么启示? 不起眼的开始 招聘前端工程师,尤其是中高级前端 ...

随机推荐

  1. pytest的fixture怎么用?

    文章总览图 fixture和unittest是冲突的.舍弃unittest只用pytest. 会遇到在很多用例当中,它的前置条件是长得一样的.用例写的越来越多的时候,肯定会遇到前置条件都差不多,大家差 ...

  2. GitHub 热点速览 Vol.34:亚马逊、微软开源项目带你学硬核技术

    作者:HelloGitHub-小鱼干 摘要:站在巨人的肩膀上才能看得更远,本周上榜的 computervision-recipes 便是典型代表,这个由微软开源的计算机视觉最佳实践项目,多次上 Git ...

  3. js实现csv下载

    var TableDatas  = '数据源';function getCSV(){ if(this.TableDatas.length === 0){ alert("没有数据呀呀呀呀!&q ...

  4. ORA-01455: converting column overflows integer datatypes.

    系统执行抛了一个ORA-01455: converting column overflows integer datatypes.把当时执行的SQL取出来,在plsql developer里面执行是没 ...

  5. laravel Application实例化后两个方法

    laravel容器初始化registerBaseServiceProviders方法 上篇讲解了laravel容器的基本使用和原理,这篇继续Application构造方法中的registerBaseS ...

  6. android开发 app闪退后fragment重叠bug解决方法,推荐使用第二种方法,完美解决问题

    解决方案为以下两种: 方法1:在fragmentActivity里oncreate方法判断savedInstanceState==null才生成新Fragment,否则不做处理. 方法2:在fragm ...

  7. Java拷贝——深拷贝与浅拷贝

    深拷贝和浅拷贝 值类型 vs 引用类型 在Java中,像数组.类Class.枚举Enum.Integer包装类等等,就是典型的引用类型,所以操作时一般来说采用的也是引用传递的方式: 但是Java的语言 ...

  8. Rakefile

    Rakefile https://www.jianshu.com/p/b18a6e42455a RAKE – Ruby Make http://docs.seattlerb.org/rake/ bun ...

  9. Stack (30)(模拟栈,输出中间数用set)

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  10. Maven 仓库镜像设置

    <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>al ...