一道無限極類 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;
}

用了兩次遞歸,最終輸出結果沒有問題,但是總感覺應該有比較簡便的方法。留着以后改進吧!!|・ω・`)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM