PHP 结合了两个多维数组

PHP combine two multi-dimensional arrays

提问人:DanielAttard 提问时间:12/5/2011 最后编辑:DanielAttard 更新时间:12/6/2011 访问量:5869

问:

我正在尝试使用 array_combine 来组合两个多维数组,但不知何故没有正确完成。

下面是 array1:

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

这里是 array2:

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>';
PHP 多维数组

评论

0赞 phpmeh 12/5/2011
您是想保留关键引用还是不在乎它是否变成 0 1 2?数组中不能有两个“C”或“I”或任何其他值的键。
0赞 Yes Barry 12/5/2011
为什么从字面上看,你所有的问题都有完全相同的内容和数组?我们是为你做作业还是为学校做些什么?从字面上看,这是我在过去一两周看到的你的第三个第四个问题,与前一个问题几乎完全相同。
0赞 DanielAttard 12/5/2011
@phpmeh,不,我不想保留关键引用。
0赞 DanielAttard 12/5/2011
@mmmshuddup,我的问题具有相同的内容和数组,因为我仍在试图弄清楚相同的事实情况。这不是学校的家庭作业。我只是想学习如何正确使用多维数组。
0赞 Yes Barry 12/5/2011
明白了。只要确保它在任何方面都不是假的,哈哈。谢谢你清理了这个问题!

答:

1赞 Yes Barry 12/5/2011 #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 12/6/2011
感谢您的回答,但我在实施它时遇到了麻烦。我已经编辑了我的问题,以向您展示我到目前为止尝试过的内容。你能看出我做错了什么吗?
0赞 Yes Barry 12/6/2011
该函数实际上不返回任何内容。它接受的第一个参数 () 是通过引用(因此是 )。cust_array_merge$array1&
0赞 Yes Barry 12/6/2011
我更改了它,以便它现在将返回合并的数组。看看我编辑的功能,这应该对你有用。
1赞 DanielAttard 12/7/2011
非常感谢@mmmshuddup。我让你的解决方案起作用,并在这个过程中学到了一两件事。你为我做这件事真是太酷了。让我度过了愉快的一天。干杯。
0赞 DanielAttard 12/7/2011
我确实注意到您的结果将数字四舍五入到最接近的整数,而不是保持十进制精度。不要担心修复它,因为发布的另一个答案也有效,并保持十进制精度。
3赞 Francis Avila 12/5/2011 #2

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

只是为了好玩,这里有两种方法。这两者都比 慢一些,但说明了一些有用的数组概念。(在比 php 更具有函数性的其他语言中,这些语言可能是首选。merge_flatten_branches

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 12/7/2011
这是非常酷的弗朗西斯。您的解决方案非常到位。正是我想要的结果。现在我只需要把我的脑袋包裹起来,它是如何完成的。非常感谢。
0赞 Yes Barry 12/7/2011
想想它是怎么完成的?另一方面,我只是想理解术语到底是什么意思。所有这些东西都是相当深奥的。神秘的函数名称...不酷。如果这是一个聪明但毫无意义的功能名称竞赛,将以优异的成绩获胜,哈哈。尽管如此,+1 表示有效解决方案。flatten_leafmerge_flatten_branches_reduce