2014-01-06 58 views
0

這似乎是顯而易見的,但我有以下的遞歸函數:轉化二維數組轉換成一維

public static function dependencies($from_id) { 
    $core = Core::getInstance(); 
    $query = $core->pdo->prepare("SELECT access_code FROM dependencies WHERE hierarchy=:id"); 
    $query->bindValue(":id",$from_id); 
    $query->execute(); 
    while($data = $query->fetch()) { 
     $codes[$data['access_code']] = self::dependencies($data['access_code']); 
    } 

    return $codes; 

} 

這一結果的輸出:

Array 
(
    [12] => 
    [17] => Array 
     (
      [101] => 
      [104] => 
     ) 

    [18] => 
) 

這些值將永遠是獨一無二的,想將此結果轉換爲單個一維數組。什麼是最有效的方法呢?

例如:$array = array(12,17,101,104,18);

回答

1

嘗試遞歸方法:

$codes = array(12 => '', 17 => Array(101 => '', 104 => ''), 18 => ''); 
$res = flat_array_keys($codes); 
echo '<pre>',print_r($res),'</pre>'; 
/* result is 
Array 
(
    [0] => 12 
    [1] => 17 
    [2] => 101 
    [3] => 104 
    [4] => 18 
)*/ 

function flat_array_keys($arr) { 
    $result = array(); 

    foreach ($arr as $k => $v) { 
     $result[] = $k; 
     if (is_array($v)) 
      $result = array_merge($result, flat_array_keys($v)); 
    } 

    return $result; 
} 
+0

這是我想到的。我認爲有一種使用PHP展平數組的原生方式。但是,這工作得很好,謝謝。 – Dimitri

+0

打我吧: -/ – bobkingof12vs

+0

這太浪費了。在'array_reduce'或'call_user_func_array'的遞歸過程中,數組可以被平坦化。 –

1

編輯: $ flat_codes = call_user_func_array( 'array_merge',$代碼);

對不起,我沒有仔細閱讀這個問題。

這應該工作:

<?php 
function merge_keys ($in, &$out = array()) { 
    foreach ($in as $k=>$val) { 
     array_push ($out, $k); 
     if (is_array ($val)) merge_keys ($val, $out); 
    } 
    return $out; 
} 

$input = Array 
(
    "12" => "", 
    "17" => Array 
     (
      "101" => "", 
      "104" => "", 
     ), 

    "18" => "" 
); 

$output = merge_keys ($input); 
print_r($input); echo"<br />"; 
print_r($output); 
?> 

通過引用跑過阿雷比其他的解決方案,其產生複製稍微更有效。但是,對於一小部分數據來說,差異幾乎不會引人注目。

+0

運行此發出警告,'的var_dump($ flat_codes);'顯示NULL。 –

+0

@u_mulder對不起,我是粗心的。這應該工作。 –