2011-05-08 32 views
29

如何才能讓array_merge()覆蓋兩個數組中具有不同值但密鑰索引相同的鍵?帶有數字鍵的PHP array_merge

例如,合併:

[0] => 'whatever'

[0] => 'whatever', [1] => 'a', [2] => 'b'

應該產生

[0] => 'whatever', [1] => 'a', [2] => 'b'

基本上我想array_merge到bahave如果陣列具有字符串鍵它的工作方式......

回答

60

使用+運算符。

比較array_merge+操作:

<?php 

$a1 = array(0=>"whatever",); 
$a2 = array(0=>"whatever",1=>"a",2=>"b"); 

print_r(array_merge($a1,$a2)); 
print_r($a1+$a2); 
?> 

輸出:

Array 
(
    [0] => whatever 
    [1] => whatever 
    [2] => a 
    [3] => b 
) 
Array 
(
    [0] => whatever 
    [1] => a 
    [2] => b 
) 

+操作仍然作品,如果你的關聯數組具有數字鍵外的順序:

<?php 

$a1 = array(0=>"whatever",); 
$a2 = array(1=>"a",0=>"whatever",2=>"b"); 

print_r(array_merge($a1,$a2)); 
print_r($a1+$a2); 
?> 

輸出:

Array 
(
    [0] => whatever 
    [1] => a 
    [2] => whatever 
    [3] => b 
) 
Array 
(
    [0] => whatever 
    [1] => a 
    [2] => b 
) 

注意array_merge這種情況下創建一個新的關鍵。不可取...

+4

您可能想要使用不同的值來演示「+」保留左數組值,而array_merge使用正確的數組值(用於重複鍵)。 – 2013-02-13 23:30:40

+0

注意:如果你使用'array $ a1 + array $ a2' - 你將得到正確的數據,如果key是相同的(甚至是索引數組),那麼'$ a1'將覆蓋$ a2的值,但是:'json_encode()'的當前總和將返回對象 - 而不是數組! 'array_values($ a1 + $ a2)'將返回混洗結果,依此類推......,最好再寫一個循環,然後手動合併......(我在寫這裏之前檢查過它,就在一分鐘前在尋找問題時遇到一些麻煩,爲什麼JS插件不想工作......) – LINKeRxUA 2016-06-01 16:15:58

+0

@LINKeRxUA我寧願在聯合之後在數組上運行'ksort',而不是添加一個六行函數來處理特定的用例。 – Brilliand 2017-08-24 00:02:23

7

很容易手工編寫:

function array_merge_custom($first, $second) { 
    $result = array(); 
    foreach($first as $key => $value) { 
     $result[$key] = $value; 
    } 
    foreach($second as $key => $value) { 
     $result[$key] = $value; 
    } 

    return $result; 
} 

更新:此行爲與聯合運營商(return $first + $second;),因爲在不同的這種情況下第二個數組在兩個元素具有相同的密鑰時獲勝。

但是,如果切換參數的位置,並且在發生衝突時將想要「贏」的數組放置爲第一個操作數,則可以獲得相同的行爲。所以上面的函數的行爲完全像return $second + $first;

+0

致謝!這幫助我沒完沒了! – Compy 2013-11-20 14:48:41

+0

它不完全像'$ second + $ first'。我無法在此格式化,所以我會發佈一個答案讓它更清晰。 – 2017-04-21 17:36:47

0

您可以使用array_merge(),然後使用array_unique()

+0

如果你的價值觀有機會不唯一,這不是一個好的解決方案。 – 2016-07-01 00:48:30

3
function array_merge_custom() 
{ 
    $array  = array(); 
    $arguments = func_num_args(); 
    foreach($arguments as $args) 
     foreach($args as $key => $value) 
      $array[$key] = $value; 
    return $array; 
} 
2

您應該使用$a2+$a1得到相同的結果與array_merge($a1,$a2);

$a1 = array(
    'k1' => 1, 
    'k2' => 2, 
    'k3' => 3, 
); 

$a2 = array(
    'k1' => 11, 
    'k2' => 22, 
    'k4' => 44, 
); 

代碼:

print_r(array_merge($a1,$a2)); 

輸出:

Array ( 
    [k1] => 11 
    [k2] => 22 
    [k3] => 3 
    [k4] => 44 
) 

代碼:

print_r($a1+$a2); 

輸出:

Array ( 
    [k1] => 1 
    [k2] => 2 
    [k3] => 3 
    [k4] => 44 
) 

代碼:

print_r($a2+$a1); 

輸出:

Array ( 
    [k1] => 11 
    [k2] => 22 
    [k4] => 44 
    [k3] => 3 
) 
0
the solution could be this: 
function array_merge_custom($array1, $array2) { 
    $mergeArray = []; 
    $array1Keys = array_keys($array1); 
    $array2Keys = array_keys($array2); 
    $keys = array_merge($array1Keys, $array2Keys); 

    foreach ($keys as $key) { 
     $mergeArray[$key] = array_merge_recursive(isset($array1[$key]) ? $array1[$key] : [], isset($array2[$key]) ? $array2[$key] : []); 
    } 

    return $mergeArray; 
} 

$array1 = [ 
    '66_' => [ 
     'k1' => 1, 
     'k2' => 1, 
    ], 
    '67_' => [ 
     'k1' => 1, 
     'k2' => 1, 
    ], 
    '68_' => [ 
     'k1' => 1, 
     'k2' => 1, 
    ], 
    68 => [ 
     'k1' => 1, 
     'k2' => 1, 
    ] 
]; 
$array2 = [ 
    '66_' => [ 
     'a1' => 1, 
     'a2' => 1, 
    ], 
    '68_' => [ 
     'b1' => 1, 
     'b2' => 1, 
    ], 
    68 => [ 
     'b1' => 1, 
     'b2' => 1, 
    ] 
]; 
echo '<pre>'; 
print_r(array_merge_custom($array1, $array2)); 
0
$arrA = [10, 11, 12]; 
$arrB = [12, 13]; 

$arrCommon = array_keys(array_flip($arrA) + array_flip($arrB)); 

print_r($arrCommon); 
Array 
(
    [0] => 10 
    [1] => 11 
    [2] => 12 
    [3] => 13 
) 

比較,以WRONG使用 「+」

$arrCommon = $arrA + $arrB; 

print_r($arrCommon); 
Array 
(
    [0] => 10 
    [1] => 11 
    [2] => 12 
)