2010-10-25 79 views
1
$a = array('matches' => 
     array(
      '5' => array('weight' => 6), 
      '15' => array('weight' => 6), 
     ) 
    ); 

    $b = array('matches' => 
     array(
      '25' => array('weight' => 6), 
      '35' => array('weight' => 6), 
     ) 
    ); 

    $merge = array_merge($a, $b); 

    print_r($merge); 

這個腳本的結果是PHP array_merge問題

Array 
(
    [matches] => Array 
     (
      [25] => Array 
       (
        [weight] => 6 
       ) 

      [35] => Array 
       (
        [weight] => 6 
       ) 

     ) 

) 

但是,爲什麼?

我想要的結果是這樣的:

Array 
(
    [matches] => Array 
     (
      [5] => Array 
       (
        [weight] => 6 
       ) 

      [15] => Array 
       (
        [weight] => 6 
       ) 
      [25] => Array 
       (
        [weight] => 6 
       ) 

      [35] => Array 
       (
        [weight] => 6 
       ) 

     ) 

) 

回答

9

因爲第一個陣列中的密鑰'matches'正在被第二個中的同一個密鑰覆蓋。你需要做的這個代替:

$merge = array('matches' => array()); 
$a = array(
    'matches' => array(
     '5' => array('weight' => 6), 
     '15' => array('weight' => 6) 
    ) 
); 

$b = array(
    'matches' => array(
     '25' => array('weight' => 6), 
     '35' => array('weight' => 6) 
    ) 
); 

$merge['matches'] = array_merge($a['matches'], $b['matches']); 

print_r($merge); 

UPDATE

爲了保護數字鍵,你就必須做到這一點:

$merge['matches'] = $a['matches'] + $b['matches']; 

如果使用數組union運算符像這樣,只需記住以下從php.net:

從第一陣列y將被保留。如果在兩個數組中都存在數組鍵,則將使用第一個數組中的元素,並忽略第二個數組中的匹配鍵元素。

http://php.net/manual/en/function.array-merge.php

+0

我如何保存「關鍵」比賽?需要「5,15,25,35」,但有「0,1,2,3」 – Isis 2010-10-25 21:59:40

+1

你將不得不停止使用array_merge。根據PHP文檔,即使您嘗試在數組中使用數字,array_merge也會總是重新編號數字鍵,例如'array('1'=>'something','2'=>'something');'。爲了保存鍵,你必須使用'+'數組聯合。我會更新我的答案。 – Stephen 2010-10-25 22:03:20

+1

http://ru2.php.net/manual/en/function.array-merge-recursive.php#96201尋找,謝謝 – Isis 2010-10-25 22:05:22

-1

嗯,你可以做手工:

$mergedArray = array();  

    foreach($a as $key => $value) 
    { 
     $mergedArray[$key] = $value; 
    } 

    foreach($b as $key => $value) 
    { 
     $mergedArray[$key] = $value; 
    } 
+1

這將導致原始海報已經具有完全相同的問題。事實上,他會得到與他所建議的他試圖解決的問題相同的輸出。 – M2tM 2010-10-25 21:36:40

0

您正在合併數組的頂層。 array_merge()函數看到它們都包含「matches」元素,因此它會選擇一個作爲合併結果。

如果您希望它進一步掃描,您需要在陣列的下一級執行array_merge()。在這種情況下,它是相對簡單的,因爲你只在每個陣列的頂層有一個元素,所以你只需要一條線 - 事情是這樣的:

$merge['matches'] = array_merge($a['matches'], $b['matches']); 

一個更復雜的陣列結構將需要更多的工作,但是。

希望有所幫助。

0

嘗試:

$merge = array(); 
$merge['matches'] = array_merge($a['matches'], $b['matches']); 

您的問題是要合併的頂級美元陣列$ B和這兩個有一個「匹配」索引所以它接受$ b的那個元素的版本。你可以通過顯式合併索引的數組($ a ['matches']和$ b ['matches'])並將其分配給合併數組($ merge ['matches'])來解決這個問題,這將導致預期的行爲。

或者array_merge_recursive會做你想做的。

4

嘗試使用array_merge_recursive而不是array_merge