2011-12-05 140 views
5

我想使用array_combine結合兩個多維數組,但不知怎的,沒有正確地做。PHP結合了兩個多維數組

這裏是陣列1:

Array(
    [Nov 18, 2011] => Array(
     [C] => 107705.5792 
     [I] => 44561.52 
    ) 
    [Nov 22, 2011] => Array(
     [C] => -8992.8352 
    ) 
) 

這裏是數組2:

Array(
    [Nov 18, 2011] => Array(
     [C] => 3 
     [I] => 1 
    ) 
    [Nov 22, 2011] => Array(
     [C] => 2 
    ) 
) 

這是我在array_combine的嘗試,這是行不通的:

$array1 = ($arr1); 
$array2 = ($arr2); 
$result = array_combine($arr1, $arr2); 
echo '<pre>'; 
print_r($result); 
echo '</pre>'; 

我在做什麼錯誤?這是我正在尋找的結果:

Array(
    [Nov 18, 2011] => Array(
     [3] => 107705.5792 
     [1] => 44561.52 
    ) 
    [Nov 22, 2011] => Array(
     [2] => -8992.8352 
    ) 
) 

感謝您的幫助。

  • 編輯 -

我發現,如果我改用array_merge_recursive,這是我的,我得到的結果。不是我一直在尋找,但接近:

Array(
    [Nov 18, 2011] => Array(
     [C] => Array(
      [0] => 3 
      [1] => 107705.5792 
     ) 
     [I] => Array(
      [0] => 1 
      [1] => 44561.52 
     ) 
    ) 
    [Nov 22, 2011] => Array(
     [C] => Array(
      [0] => 2 
      [1] => -8992.8352 
     ) 
    ) 
) 
  • 進一步編輯 -

這裏是我曾經試圖實施以下建議之一的方式,然而這不工作我。什麼是錯的?:

function cust_array_merge(array &$array1, array $array2){ 
    // loop through main array 
    foreach ($array1 as $key => $val) { 
     // check if $array2 has the same index 
     if (array_key_exists($key, $array2)) { 
      // reset $array1's indexes to $array2's values 
      foreach ($array2[$key] as $subKey => $subVal) { 
       if (array_key_exists($subKey, $array1[$key])) { 
        $tempVal = $array1[$key][$subKey]; 
        unset($array1[$key][$subKey]); 
        $array1[$key][$subVal] = $tempVal;}}}}} 

$merged = cust_array_merge($arr_cats_per_bill_date, $arr_cvat); 
echo '<pre>'; 
    print_r($merged); 
echo '</pre>'; 
+0

你想保留關鍵引用或你不關心,如果它變成0 1 2?數組中不能有兩個「C」或「I」鍵或任何其他值。 – phpmeh

+0

爲什麼字面上** ALL **的問題具有完全相同的內容和數組?我們是在做你的功課還是爲了學校?這實際上就是我在上週或第二週看到的第三個或第四個問題,與前一個問題幾乎完全相同。 –

+0

@phpmeh,不,我不想保留關鍵參考。 – DanielAttard

回答

3

array_merge_recursive讓你非常接近(你的「鑰匙」是葉數組索引1,你的價值是在索引0)。因此,分兩步進行:首先獲取合併數組,然後擺弄分支以使其正確。

// This is a callback for array_map() which should have some more generic uses. 
// array(array('k', 'v'), ...) -> array('k' => 'v', ...) 
function flatten_branches($branches) { 
    $newleaves = array(); 
    foreach ($branches as $leaf) { 
     $newleaves[$leaf[0]] = $leaf[1]; 
    } 
    return $newleaves; 
} 

function merge_flatten_branches($karray, $varray) { 
    //$karray has the key-leaves, and $varray has the value-leaves 
    $m1 = array_merge_recursive($karray, $varray); 
    return array_map('flatten_branches', $m1); 
} 

$merged = merge_flatten_branches($array2, $array1); 
print_r($merged); 

只是爲了好玩,這裏有兩種方法。這兩個都比merge_flatten_branches慢一些,但說明了一些有用的數組概念。 (在其他更功能性的語言比PHP,這些可能是首選)。

function merge_flatten_branches_reduce($karray, $varray) { 
    //$karray has the key-leaves, and $varray has the value-leaves 
    $m1 = array_merge_recursive($karray, $varray); 
    return array_map('flatten_branches_reduce', $m1); 
} 

function merge_flatten_branches_add($karray, $varray) { 
    //$karray has the key-leaves, and $varray has the value-leaves 
    $m1 = array_merge_recursive($karray, $varray); 
    return array_map('flatten_branches_add', $m1); 
} 

// The functions below are callbacks for the two above. 

function array_add($a1, $a2) { 
    return $a1+$a2; 
} 

function flatten_leaf($leaf) { 
    return array($leaf[0] => $leaf[1]); 
} 

function flatten_branches_add($branches) { 
    $leaves = array_map('flatten_leaf', ($branches)); 
    $finalleaves = array(); 
    foreach ($leaves as $leaf) { 
     $finalleaves += $leaf; 
    } 
    return $finalleaves; 
} 


function flatten_branches_reduce($branches) { 
    $l = array_map('flatten_leaf', ($branches)); 
    return array_reduce($l, 'array_add', array()); 
} 
+0

這是非常酷的弗朗西斯。你的解決方案是點亮的。正是我期待的結果。現在我只需要圍繞如何完成。非常感謝。 – DanielAttard

+0

將你的頭圍繞着_顯示它已完成_?另一方面,我只是想了解術語應該是什麼意思。所有'flatten_leaf'的東西都是相當深奧的。神祕的功能名稱...不酷。如果這是一個聰明的,但毫無意義的函數名稱競賽,「merge_flatten_branches_reduce」將會贏得色彩繽紛的笑聲。儘管如此,+1的工作解決方案。 –

1

你要找的結果看起來真的很適合我。也就是說,我不知道任何內置的PHP數組函數,它們可以做。但是,我確實爲您編寫了自定義函數。 警告:這是非常適合這個場合,因此可能不是很可可重複使用

function cust_array_merge(array $array1, array $array2) 
{ 
    $merged = array(); 
    // loop through main array 
    foreach ($array1 as $key => $val) { 
     // check if $array2 has the same index 
     if (array_key_exists($key, $array2)) { 
      // reset $array1's indexes to $array2's values 
      foreach ($array2[$key] as $subKey => $subVal) { 
       if (array_key_exists($subKey, $array1[$key])) { 
        $tempVal = $array1[$key][$subKey]; 
        unset($array1[$key][$subKey]); 
        $array1[$key][$subVal] = $tempVal; 
       } 
      } 
      $merged = $array1; 
     } 
    } 
    return $merged; 
} 
+0

感謝您的回答,但我在實施時遇到問題。我編輯了我的問題,向您展示我迄今爲止所嘗試的內容。你能看到我做錯了什麼嗎? – DanielAttard

+0

'cust_array_merge'函數實際上並不返回任何內容。它接受的第一個參數('$ array1')是由_reference_(因此是'&')。 –

+0

我改變了它,現在它會返回合併數組。看看我編輯的功能,這應該適合你。 –