PHP合并两个多维数组

6

我将尝试使用array_combine函数来合并两个多维数组,但是不知道为什么合并不正确。

这里是array1:

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 1 2?你的数组中不能有两个键"C"或"I"或任何其他值。 - phpmeh
为什么你所有的问题都有完全相同的内容和数组?我们是在帮你做作业还是学校的任务吗?这已经是我在过去一两周里看到的第三或第四个几乎与之前的问题完全相同的问题了。 - Yes Barry
@phpmeh,不,我不想保留关键引用。 - DanielAttard
@mmmshuddup,我的问题具有相同的内容和数组,因为我仍在尝试弄清楚相同的事实情况。这不是学校作业。我只是试图学习如何正确地使用多维数组。 - DanielAttard
明白了,只是确保它没有任何虚假的地方哈哈。谢谢你澄清! - Yes Barry
在数组中有非顺序的数字键是有点不寻常的。您确定这是处理问题所需的最佳数据结构吗? - Francis Avila
2个回答

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());
}

这非常棒,Francis。你的解决方案很准确,正是我想要的结果。现在我只需要理解它是如何完成的。非常感谢。 - DanielAttard
你能理解“它是如何完成的”吗?而我只是试图理解这些术语到底是什么意思。所有那些flatten_leaf的东西都相当深奥。晦涩的函数名...不酷。如果这是一个聪明但毫无意义的函数名比赛,merge_flatten_branches_reduce肯定会大获全胜哈哈。尽管如此,还是要给你的解决方案点个赞。 - Yes Barry

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;
}

谢谢你的回答,但我在实现它时遇到了麻烦。我已经编辑了我的问题,向你展示了我迄今为止尝试过的内容。你能看出我做错了什么吗? - DanielAttard
cust_array_merge函数实际上并不返回任何内容。它接受的第一个参数($array1)是通过_引用_传递的(因此有&)。 - Yes Barry
我已经修改了代码,现在它会返回合并后的数组。请查看我的编辑后的函数,这应该可以解决你的问题。 - Yes Barry
1
非常感谢 @mmmshuddup,我成功实现了您的解决方案,并在此过程中学到了一些东西。非常感谢您为我所做的一切,这让我的一天变得更加美好。祝您好运。 - DanielAttard
我注意到你的结果将数字四舍五入为最接近的整数,而不是保留小数精度。不用担心修复它,因为其他发布的答案也可以工作,并且保持小数精度。 - DanielAttard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接