一道遞迴陣列面試題

pardon110發表於2020-08-02

題面

$a = [  
 '張三' => [  
    '李四' => [  
       '王五' => null,  
       '二六' => null  
     ],  
    '王峰' => [  
      '王芳' => null  
     ]  
 ],  
 '王麻子' => [  
     '小二' => null,  
     '小明' => [  
        '小灰' => null  
      ]  
 ]  
];  

要求寫一個函式,輸出這樣的內容:

張三:李四 王峰 王五 二六  王芳
李四: 王五 二六
王峰:王芳
王麻子:小二 小明 小灰
小明:小灰

分析

  • 直接遞迴,結果行首列 得張三,王麻子...與要求不符
  • 分開遞迴,一部明確鍵即冒號左側,另一部分處理右側
  • 故重構源,根據重建後的值域,收集鍵,即右側實現

程式碼

// 1.重構源資料,確保鍵名有序
function rebuild($arr)
{
    $l = [];
    if (is_array($arr)) {
        $keys = array_keys($arr);
        for ($i=0;$i<count($keys);$i++) {
            if (is_null($arr[$keys[$i]])) {
                continue;
            }
            $l[$keys[$i]]=$arr[$keys[$i]];
            $l=array_merge($l, rebuild($l[$keys[$i]]));
        }
    }
    return $l;
}


// 2.遞迴收集值中的鍵
function recursive_keys($input)
{
    $output =  array_keys($input);
    foreach ($input as $v) {
        if (is_array($v)) {
            $output = array_merge($output, recursive_keys($v));
        }
    }
    return $output ;
}

// 3. 合併重組
function merge($arr)
{
    $rs = [];
    foreach(rebuild($arr) as $k => $v){
        $rs[$k] = recursive_keys($v);
        echo $k," : ",implode(" ", $rs[$k]),"\n";
    }
    return $rs;
}

merge($a);

效果

D:\code-base\algorithm\php>php "d:\code-base\algorithm\php\array\interview.php"
張三 : 李四 王峰 王五 二六 王芳
李四 : 王五 二六
王峰 : 王芳
王麻子 : 小二 小明 小灰
小明 : 小灰
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章