组织结构的递归输出方法

一道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."&nbsp;&nbsp;";
        }
        echo "<br/>";
    }
}

最终的输出结果:

张飞:
刘备:张飞  关羽  马良  
马良:
关羽:马良  
张三:刘备  张飞  关羽  马良  孟达  
孟达:
荀攸:
曹操:荀攸  贾诩  郭嘉  程昱  
贾诩:
郭嘉:
程昱:
王五:曹操  荀攸  贾诩  郭嘉  程昱  张郃  
张郃:
李四:王五  曹操  荀攸  贾诩  郭嘉  程昱  张郃  

可以看出递归方法 getChild 要处理层级关系,
该方法构建时,需要想清楚其中的传参,如果只传入 $team变量、很难构造出清晰的上下级关系,如果传入的是当前的key和其子节点数组,则层次关系更清晰一些,编码也更容易一些。切记,分析问题,找到切入点 比立即动手写更重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值