2011-12-05 141 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

我改变了它,现在它会返回合并数组。看看我编辑的功能,这应该适合你。 –