Php 合并数组并在键相等时覆盖值

Php 合并数组并在键相等时覆盖值,php,arrays,session,multidimensional-array,array-merge,Php,Arrays,Session,Multidimensional Array,Array Merge,我将客户订单的数据保存在$_SESSION['input']多维数组中,如下所示: $\u SESSION['input']['6']['s']==4//这意味着客户订购了id为6、大小为s的4x产品 对于通过$_POST['input'](也是一个具有相同格式的多维数组)提交的每个新输入,我想用$_POST['input']数据添加和/或覆盖$_会话['input']数据 问题是: 当我使用 $\u SESSION['input']=array\u merge($\u SESSION['inp

我将客户订单的数据保存在$_SESSION['input']多维数组中,如下所示:

$\u SESSION['input']['6']['s']==4//这意味着客户订购了id为6、大小为s的4x产品

对于通过$_POST['input'](也是一个具有相同格式的多维数组)提交的每个新输入,我想用$_POST['input']数据添加和/或覆盖$_会话['input']数据

问题是:

  • 当我使用 $\u SESSION['input']=array\u merge($\u SESSION['input'],$\u POST['input']),覆盖是正确的,但数组的关联键已更改为数字键
  • 当我使用$\u SESSION['input']=$\u SESSION['input']+$\u POST['input']时,所有键都被正确保留,但对于相同的键,值不会被覆盖
  • 我找到的所有答案要么是不覆盖值,要么是不合并数组就覆盖值

    有没有这个功能?或者其他一些想法?

    为什么不使用for()循环来实现呢


    在一个数组上循环并检查另一个数组中是否存在相同的键,如果存在,则覆盖与当前键对应的第一个数组值。

    您可以修改在中提供的函数以保留“深”键,类似于

    function arraysMergeUnique($array1, $array2)
    {
        foreach ($array2 as $k => $v) {
            if ( is_array($array1) ) {
                if ( is_string($v) && ! in_array($v, $array1) ) {
                    /**
                     *  Preserve keys in n-dimension using $k
                     */
                    $array1[$k] = $v;
                } else if ( is_array($v) ) {
                    if ( isset($array1[$k]) ) {
                        $array1[$k] = arraysMergeUnique($array1[$k], $v);
                    } else {
                        $array1[$k] = $v;
                    }
                }                
            } else {
                $array1 = array($v);
            }
        }
        return $array1;
    }
    
    $one = array('input' => array(6 => array('s' => 'old')));
    $two = array('input' => array(6 => array('s' => 'new')));
    $three = arraysMergeUnique($one, $two);
    
    三美元就是:

    Array
    (
        [input] => Array
            (
                [6] => Array
                    (
                        [s] => new
                    )
    
            )
    
    )
    

    我利用了Dave和mArm.ch的想法,提出了一个非常简单的解决方案

    目标是合并关联的
    $array1
    $array2
    并用
    $array2
    覆盖
    $array1

    守则:

    foreach (array_keys($array2) as $key) {
        if (isset($array1[$key]) unset($array1[$key]);
    }
    $desired_array = $array1 + $array2;
    
    所以基本上,当存在重叠时,我从一个数组中删除键,然后我可以简单地添加它们


    请确保两个数组
    isset()
    都是\u array()
    。否则会出现致命错误。

    为什么要将id存储为数组中的字符串。。。