doupeng8494 2011-12-05 05:44
浏览 41
已采纳

PHP结合了两个多维数组

I am trying to use array_combine to combine two multi-dimensional arrays, but somehow not doing it correctly.

Here is array1:

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

and here is array2:

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

Here is my attempt at array_combine, which is not working:

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

What am I doing wrong? This is the result that I am looking for:

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

Thanks for your help.

  • EDIT -

I have found that if I instead use array_merge_recursive, this is my the result that I get. Not what I was looking for, but close:

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
        )
    )
)
  • FURTHER EDIT -

Here is the way that I have tried to implement one of the suggestions below, however this is not working for me. What is wrong?:

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>';
  • 写回答

2条回答 默认 最新

  • doudanglang5826 2011-12-05 08:38
    关注

    array_merge_recursive gets you very close (your "key" is in index 1 of leaf arrays, and your value is in index 0). So do it in two steps: first get the merged array, then fiddle with the branches to get it right.

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

    Just for fun, here are two more approaches. Both of these are a bit slower than merge_flatten_branches, but illustrate some useful array concepts. (In other more functional-flavored languages than php, these might be preferred.)

    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());
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥30 自适应 LMS 算法实现 FIR 最佳维纳滤波器matlab方案
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动