php web考试题,一道无限极类 PHP 试题

2cfeccc546afb58e7f75a8303b0b85df.png

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

试题

有下面一个数组:

$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) : ‘无‘) . ‘
‘;

}

return $str;

}

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

一道无限极类 PHP 试题

原文:https://www.cnblogs.com/bndong/p/12762990.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值