2013-05-31 108 views
2

我有2個數組,我希望通過每個數字鍵合併/組合在一起。 如合併2個數組併合並數字鍵的結果

Array1 
(
    [2009] => 131 
    [2008] => 940 
    [2007] => 176 
    [2006] => 1 
) 
Array2 
(
    [2008] => 9 
    [2007] => 3 
) 

我想輸出是:

Array (
    [2009] => 131 
    [2008] => Array (
        [0]=>940 
        [1]=>9 
        ) 
    [2007] => Array (
        [0]=>176 
        [1]=>3 
        ) 
    [2006] => 1 
) 

如何在地球上我做到這一點?我曾嘗試array_merge,但我失去了我的密鑰,他們不分組。

+0

您可能必須爲此行爲編寫自己的函數 –

回答

0

我終於找到這個功能,幫助我。謝謝大家的意見。

function merge_common_keys() 
{ 
    $arr = func_get_args(); 
    $num = func_num_args(); 
    $keys = array(); 
    $i = 0; 
    for ($i = 0; $i < $num; ++$i) { 
     $keys = array_merge($keys, array_keys($arr[$i])); 
    } 
    $keys = array_unique($keys); 
    $merged = array(); 
    foreach ($keys as $key) { 
     $merged[$key] = array(); 
     for ($i = 0; $i < $num; ++$i) { 
      $merged[$key][] = isset($arr[$i][$key]) ? $arr[$i][$key] : null; 
     } 
    } 
    return $merged; 
} 
0

兩個數組使用相同的密鑰,所以你可以做一些簡單的像這樣(只適用於一個級別,雖然):

foreach ($array2 as $key => $value) 
{ 
    $array1[$key][] = $value 
} 

更新:

$array3 = array() 
foreach ($array1 as $key => $value) 
{ 
    $array3[$key][] = $value 
} 
foreach ($array2 as $key => $value) 
{ 
    $array3[$key][] = $value 
} 
+0

沒有'('和')'嗎? – EaterOfCode

+1

哦,剛剛注意到我基於這樣一個想法寫了這樣的觀點,即你的第一個變量已經每年使用數組。所以這不適用於你目前的情況。我會保留答案僅供參考。 –

+0

http://3v4l.org/iOGiG :( – EaterOfCode

1

如果我看到正確的你只想要那些按住數組的鍵,即參考更多比單個值。其他鍵仍應參考標量值...

所以你需要一個兩步策略:

// 1.) turn _all keys into arrays 
foreach (array($input1,$input2) as $array) 
    foreach ($array1 as $key=>$val) 
     $output[$key][]=$val; 
// 2.) reconvert elements with single entry to a scalar value again 
foreach ($output as $key=>$candidate) 
    if (1==count($candidate)) 
     $output[$key]=$candidate[0]; 
// test output 
print_r($output); 
1

你爲什麼不只是寫合併它們的方法?

/** 
Merge original_array with new_array 
@param array original_array 
@param array new_array 
*/ 
function merge_array($original_array, $new_array) 
{ 
    $merged_array = array(); 
    if(is_array($original_array) && is_array($new_array)) 
    { 
     foreach($original_array as $key => $value) 
     { 
      $merged_row[] = $value; 
      if(isset($new_array[$key])) 
      { 
       $merged_row[] = $new_array[$key]; 
      } 
      $merged_array[$key] = $merged_row; 
     } 
    } else $merged_array = $original_array; 
    return $merged_array; 
} 
+1

您可以通過更改函數頭來跳過第一個if語句: 函數merge_array(array $ original_array,array $ new_array) –

+0

哦很酷謝謝:-) – Killrawr

+0

歡迎您。這隻適用於數組和對象名稱,以強制參數爲該類型。這不適用於整數,字符串等。 –

0

probaly類似的東西?如果您運行爲每個陣列這樣一個循環(數組1,數組2,...)

$list = array() 

foreach($array1 as $key => $value){ 
    if(!array_key_exist($key, $array)){ 
     $list[$key] = $value 
    } else if(!is_array($list[$key])) { 
     $list[$key] = array(list[$key]) 
    } else { 
     array_push($list[$key], $value); 
    } 
} 

NB:代碼沒有經過測試...

0

嘗試:

foreach ($your_array as $key => $value) 
    $array_new[$key][] = $value; 
print_r($array_new); 
1

只是單元測試此。它應該聯合數組。請注意,它可以在性能方面得到改善。項目沒有關聯密鑰將被分組到密鑰'0'中。

public function merge(&$ar, $ar2) { 
     foreach ($ar as $k => $v) { 
     if (isset($ar2[$k])) { 
      $ar[$k] = array_merge(array($ar[$k]), array($ar2[$k])); 
     } 
     } 

     foreach ($ar2 as $k => $v) { 
     if (!isset($ar[$k])) { 
      $ar[$k] = $ar2[$k]; 
     } 
     }  
    } 

單元測試:

public static function test_merge() { 
     $ar1 = array(45, 'a' => 44, 'dog' => array(1), 'cat' => 3); 
     s($ar1, array(2, 'dog' => 2, 'cat' => 4, 'stuff' => 4.3)); 
     print_r($ar1); 
} 

其結果是:

IArray 
(
    [0] => Array 
     (
      [0] => 45 
      [1] => 2 
     ) 

    [a] => 44 
    [dog] => Array 
     (
      [0] => Array 
       (
        [0] => 1 
       ) 

      [1] => 2 
     ) 

    [cat] => Array 
     (
      [0] => 3 
      [1] => 4 
     ) 

    [stuff] => 4.3 
) 
+0

一個理想的解決方案是使用func_get_args(),因此該方法可以採用一系列數組。 –

1
<?php 
$arrOne = array(2009 => 131, 2008 => 940, 2007 => 176, 2006 => 1); 
$arrTwo = array(2008 => 9, 2007=> 3, 2011 => 67); 
$output = array(); 


foreach($arrOne as $key=>$value){ 
    if(isset($arrTwo[$key])){ 
    $output[$key][] = $value; 
    $output[$key][] = $arrTwo[$key]; 
    } 
    else{ 
    $output[$key] = $value; 
    } 
} 

$output += $arrTwo; // To consider keys that were absent in $arrOne 
print_r($output); 

?> 

檢查http://codepad.org/FrIlKRqk

輸出和結果

Array 
(
[2009] => 131 
[2008] => Array 
    (
     [0] => 940 
     [1] => 9 
    ) 

[2007] => Array 
    (
     [0] => 176 
     [1] => 3 
    ) 

[2006] => 1 
[2011] => 67 
) 
0

我看到太多的答案,但我不覺得他們可用因此Im加入我自己的

function merge(){ 
    $args = func_get_args(); 
    $new = array(); 
    foreach($args as $arg){ 
     foreach($arg as $key => $item){ 
      if(!isset($new[$key])){ 
       $new[$key] = $item; 
      }else if (!is_array($new[$key)){ 
       $new[$key] = array($new[$key],$item); 
      }else{ 
       $new[$key][] = $item; 
      } 
     } 
    } 
    return $new; 
} 

你可以把無限的論據:)