2009-10-28 76 views
3

我想這兩個陣列合併assoctiative陣列時

$arr1 = array('a' => "1", 'b' => "2", 'c' => "3"); 
$arr2 = array('a' => "9", 'b' => "8", 'd' => "7"); 

合併到一個數組,看起來像這樣

$arr1 = array( 
    'a' => array("1", "9"), 
    'b' => array("2", "8"), 
    'c' => array("3", ""), 
    'd' => array("", "7") 
); 

棘手的部分是空白計數空白。我需要保留它們。

感謝

回答

0

這裏是我的建議。根據你所描述的,它會組合任意數量的數組。

error_reporting(E_ALL | E_STRICT); 
header('Content-Type: text/plain'); 

$arr1 = array('a' => "1", 'b' => "2", 'c' => "3"); 
$arr2 = array('a' => "9", 'b' => "8", 'd' => "7"); 
$arr = combine($arr1, $arr2); 
print_r($arr); 

function combine() { 
    $keys = array(); 
    foreach (func_get_args() as $arr) { 
    if (is_array($arr)) { 
     $keys += $arr; 
    } 
    } 
    $keys = array_keys($keys); 
    $values = array_pad(array(), count($keys), array()); 
    $ret = array_combine($keys, $values); 
    foreach (func_get_args() as $arr) { 
    foreach ($keys as $k) { 
     $v = array_key_exists($k, $arr) ? $arr[$k] : ''; 
     array_push($ret[$k], $v); 
    } 
    } 
    return $ret; 
} 

輸出:

Array 
(
    [a] => Array 
     (
      [0] => 1 
      [1] => 9 
     ) 

    [b] => Array 
     (
      [0] => 2 
      [1] => 8 
     ) 

    [c] => Array 
     (
      [0] => 3 
      [1] => 
     ) 

    [d] => Array 
     (
      [0] => 
      [1] => 7 
     ) 

) 
+0

好像你是第一個訪問一個元素,然後檢查它是否爲'isset'。 – SilentGhost 2009-10-28 19:12:36

+0

正確。如果$ arr1有鍵a,b,c和$ arr2有a,b,d,$ ret將有鍵a,b,c,d。 d不會存在於$ arr2中,因此isset()檢查將OP所需的空字符串。 – cletus 2009-10-28 19:20:59

+0

我更多地指出如果沒有設置'$ v',你會得到一個通知。在你的第一個'foreach'循環中的數組求和也不適用於我。看看我發佈的代碼的修改。 – SilentGhost 2009-10-28 19:26:21

1

試試這個:

$arr1 = array('a' => "1", 'b' => "2", 'c' => "3"); 
$arr2 = array('a' => "9", 'b' => "8", 'd' => "7"); 

$keys = array(); 
$merged = array() 

for($arr1 as $key=>$val) 
{ 
    array_push($keys,$key); 
} 
for($arr2 as $key=>$val) 
{ 
    array_push($keys,$key); 
} 
for($key in keys) 
{ 
    $merged[$key] = array("",""); 
    if(isset($arr1[$key])) $merged[$key][0] = $arr1[$key]; 
    if(isset($arr2[$key])) $merged[$key][1] = $arr2[$key]; 
} 
0

我喜歡克萊圖斯的做法,所以我只是確信它的工作原理:)

function combine() { 
    $keys = array(); 
    foreach (func_get_args() as $arr) { 
     if (is_array($arr)) { 
      $keys = array_merge($keys, array_keys($arr)); 
     } 
    } 
    $keys = array_unique($keys); 
    $values = array_pad(array(), count($keys), array()); 
    $ret = array_combine($keys, $values); 
    foreach (func_get_args() as $arr) { 
     foreach ($keys as $k) { 
      $v = ''; 
      if (array_key_exists($k, $arr)){ 
       $v = $arr[$k]; 
      } 
      array_push($ret[$k], $v); 
     } 
    } 
    return $ret; 
} 
2

function merge() 
{ 

    $array_of_arrays = func_get_args(); 

    //get all the unique keys  
    $final_array_keys = array_keys(call_user_func_array("array_merge", $array_of_arrays)); 

    //make final array 
    $final_array = array(); 
    foreach($final_array_keys as $key) { 
     foreach($array_of_arrays as $current_array) { 
      $final_array[$key][] = array_key_exists($key, $current_array) ? $current_array[$key] : ""; 
     } 
    } 
    return $final_array; 

} 
+0

upvoting爲有評論的代碼 – Zak 2009-10-28 23:11:36

1
foreach (array_merge($arr1, $arr2) as $key => $val) 
{ 
    $result[$key] = array("{$arr1[$key]}", "{$arr2[$key]}"); 
} 

var_dump($result);