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

时间:2013-12-12 17:41:12

标签: php arrays session multidimensional-array array-merge

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

  

$ _ SESSION ['input'] ['6'] ['s'] === 4 //这意味着客户订购了尺寸为标识为6的4x产品。

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

问题是:

  1. 我用的时候 $ _SESSION ['input'] = array_merge($ _ SESSION ['input'],$ _ POST ['input']),覆盖正确但数组的关联键更改为数字键。
  2. 当我使用$ _SESSION ['input'] = $ _SESSION ['input'] + $ _POST ['input']时,所有键都被正确保留,但是对于相同的键,不会覆盖值。
  3. 我找到的所有答案都是为了不覆盖值或覆盖值而不合并数组。

    这是否有功能?或者其他一些想法?

3 个答案:

答案 0 :(得分:2)

您可以修改how to merge multidimensional arrays whilst preserving all unique key/values?提供的功能以保留“深层”键,这些内容符合......

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
                )

        )

)

答案 1 :(得分:1)

为什么不使用for()循环来执行此操作?

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

答案 2 :(得分:0)

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

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

代码:

foreach (array_keys($array2) as $key) {
    if (isset($array1[$key]) unset($array1[$key]);
}
$desired_array = $array1 + $array2;

所以基本上我在重叠时从一个数组中删除键,然后我可以简单地添加它们。

请确保数组isset()is_array()。否则你会收到致命的错误。