一道无限极类 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;
}
用了两次递归,最终输出结果没有问题,但是总感觉应该有比较简便的方法。留着以后改进吧!!|・ω・`)
一道无限极类 PHP 试题的更多相关文章
- 【Android】一道Android OpenGL笔试题
一道Android OpenGL笔试题 SkySeraph May. 5th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sky ...
- 解析js中作用域、闭包——从一道经典的面试题开始
如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...
- 一道SQL的面试题之联想
一道SQL的面试题之联想 本人工作在一家小型的民营企业,主要从事业务系统的日常维护,二次开发,菜鸟一枚.周五经理准备面试两个开发人员,据简历,都还比较不错,让经理产生了想法,于是准备了一套面试题目,给 ...
- 一道简单的面试题,难倒各大 Java 高手!
Java技术栈 www.javastack.cn 优秀的Java技术公众号 最近栈长在我们的<Java技术栈知识星球>上分享的一道 Java 实战面试题,很有意思,现在拿出来和大家分享下, ...
- 一道JS addEventListener面试题
在园里看到一道面试题,<div id="test">Click Here</div> var node=document.getElementById('t ...
- 由一道淘宝面试题到False sharing问题
今天在看淘宝之前的一道面试题目,内容是 在高性能服务器的代码中经常会看到类似这样的代码: typedef union { erts_smp_rwmtx_t rwmtx; byte cache_line ...
- Java类与对象初始化的过程(一道经典的面试题)
本文不再以ClassLoader的视角解释这些问题. 首先,Java代码有个特点,就是成员变量可以在前面的方法中使用,在后面定义.这一特性,很多人说Java了不起,可是为什么呢?Java为何能够这样呢 ...
- Linux fork函数具体图解-同一时候分析一道腾讯笔试题
原创blog.转载请注明出处 头文件: #include<unistd.h> #include<sys/types.h> 函数原型: pid_t fork( void); (p ...
- 一道经典JS面试题
超过80%的候选人对下面这道JS面试题的回答情况连及格都达不到.这究竟是怎样神奇的一道JS面试题?他考察了候选人的哪些能力?对正在读本文的你有什么启示? 不起眼的开始 招聘前端工程师,尤其是中高级前端 ...
随机推荐
- pytest的fixture怎么用?
文章总览图 fixture和unittest是冲突的.舍弃unittest只用pytest. 会遇到在很多用例当中,它的前置条件是长得一样的.用例写的越来越多的时候,肯定会遇到前置条件都差不多,大家差 ...
- GitHub 热点速览 Vol.34:亚马逊、微软开源项目带你学硬核技术
作者:HelloGitHub-小鱼干 摘要:站在巨人的肩膀上才能看得更远,本周上榜的 computervision-recipes 便是典型代表,这个由微软开源的计算机视觉最佳实践项目,多次上 Git ...
- js实现csv下载
var TableDatas = '数据源';function getCSV(){ if(this.TableDatas.length === 0){ alert("没有数据呀呀呀呀!&q ...
- ORA-01455: converting column overflows integer datatypes.
系统执行抛了一个ORA-01455: converting column overflows integer datatypes.把当时执行的SQL取出来,在plsql developer里面执行是没 ...
- laravel Application实例化后两个方法
laravel容器初始化registerBaseServiceProviders方法 上篇讲解了laravel容器的基本使用和原理,这篇继续Application构造方法中的registerBaseS ...
- android开发 app闪退后fragment重叠bug解决方法,推荐使用第二种方法,完美解决问题
解决方案为以下两种: 方法1:在fragmentActivity里oncreate方法判断savedInstanceState==null才生成新Fragment,否则不做处理. 方法2:在fragm ...
- Java拷贝——深拷贝与浅拷贝
深拷贝和浅拷贝 值类型 vs 引用类型 在Java中,像数组.类Class.枚举Enum.Integer包装类等等,就是典型的引用类型,所以操作时一般来说采用的也是引用传递的方式: 但是Java的语言 ...
- Rakefile
Rakefile https://www.jianshu.com/p/b18a6e42455a RAKE – Ruby Make http://docs.seattlerb.org/rake/ bun ...
- Stack (30)(模拟栈,输出中间数用set)
Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...
- Maven 仓库镜像设置
<mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>al ...