一道PHP笔试题的解法,递归地输出组织架构下的每一个人的所有下属,
大家可以先根据题目自己动手试一下
<?php
$team = [
'张三' => [
'刘备'=>[
'张飞' => null,
'关羽' => [
'马良' => null
],
],
'孟达'=>null
],
'李四' => [
'王五' => [
'曹操' => ['荀攸'=>null,
'贾诩' => null,
'郭嘉' => null,
'程昱' => null,
],
'张郃' => null,
]
],
];
/**
* 要求:根据组织结构输出每个人的所有下属
* 比如:根据示例中的组织结构可以构造出:
* 张三: 刘备,张飞,关羽,马良,孟达
* 刘备:张飞、关羽、马良
* 张飞:
* 关羽:马良
* 马良:
* 孟达:
*/
/*$items = [
'刘备' => [
'张飞' => null,
'关羽' => [
'马良' => null,
'关平' => null,
],
]
];*/
$result = [];
function getChild($parentKey, $values, &$result) {
if (empty($values)) {
$result[$parentKey] = '';
return;
}
foreach ($values as $k => $v) {
// echo "k:{$k}, v:{$v}<br/>";
if (empty($v)) {
$result[$k] = '';
$result[$parentKey][] = $k;
} else {
getChild($k, $v, $result);
$result[$parentKey][] = $k;
$result[$parentKey] = array_merge($result[$parentKey], $result[$k]);
}
}
}
foreach($team as $k => $v) {
getChild($k, $v, $result);
}
//print_r($result);
foreach($result as $k => $v) {
if (empty($v)) {
echo $k.':'.$v."<br/>";
} else {
echo $k.':';
foreach($v as $child) {
echo $child." ";
}
echo "<br/>";
}
}
最终的输出结果:
张飞:
刘备:张飞 关羽 马良
马良:
关羽:马良
张三:刘备 张飞 关羽 马良 孟达
孟达:
荀攸:
曹操:荀攸 贾诩 郭嘉 程昱
贾诩:
郭嘉:
程昱:
王五:曹操 荀攸 贾诩 郭嘉 程昱 张郃
张郃:
李四:王五 曹操 荀攸 贾诩 郭嘉 程昱 张郃
可以看出递归方法 getChild 要处理层级关系,
该方法构建时,需要想清楚其中的传参,如果只传入 $team变量、很难构造出清晰的上下级关系,如果传入的是当前的key和其子节点数组,则层次关系更清晰一些,编码也更容易一些。切记,分析问题,找到切入点 比立即动手写更重要。