如何将两个关联数组在php中合并,以便在所有情况下不覆盖任何重复的条目?

19 浏览
0 Comments

如何将两个关联数组在php中合并,以便在所有情况下不覆盖任何重复的条目?

我有两个关联数组,它们有很多相同的内容,所以我想以这样的方式合并这两个数组,即如果数组1中有a,数组2中也有a,那么在数组3中我应该有两个a的条目,而不是1个。

我尝试使用array_merge,但如果第二个数组中有任何重复项,它会覆盖第一个数组中的条目。我还尝试使用+,但它给出致命错误,说Fatal error: Unsupported operand types in /home/code.php,然后我尝试执行(array)$ar3 = (array)$ar1 +(array)$ar2,它似乎可以添加。我想知道这样做的正确方法是什么,为什么最初会出现致命错误,然后它又正常工作了,因为我已经将$ar3、$ar2、$ar1定义为数组类型。

$orders = new Order(); 
$prospectOffers = $orders->getOrder($orderConfNumber); 
$prospectOffersResult = json_decode($prospectOffers,true); 
$shoppingBasket = $cart->getCartItems(); 
var_dump($prospectOffersResult); // 两者都是数组 
var_dump($shoppingBasket); // 两者都是数组 
(array)$result = (array)$prospectOffersResult+(array)$shoppingBasket;

谢谢。

0
0 Comments

当我们在PHP中合并两个关联数组时,如果两个数组中包含相同的字符串键,则array_merge()函数将会覆盖重复的条目。具体来说,如果两个数组具有相同的字符串键,则后一个键的值将覆盖前一个键的值。但是,如果数组包含数字键,则后一个值不会覆盖原始值,而是会被追加到原始值的后面。

这种行为是PHP中array_merge()函数的预期行为。但是,如果我们不希望重复的条目被覆盖,我们应该如何处理呢?

假设我们有以下两个数组:

$arr1 = array('a' => 1);
$arr2 = array('a' => 2);

在合并这两个数组后,我们希望得到一个合理的输出。那么,合并后的数组应该如何处理重复的键值对呢?

有几种方法可以解决这个问题。以下是其中一种解决方法:

我们可以使用array_replace()函数来合并数组。与array_merge()函数不同的是,array_replace()函数将会覆盖重复的键值对。这意味着,如果两个数组中存在相同的键,则后一个键值对将会覆盖前一个键值对。但是,如果数组中只有一个数组具有某个键,则该键值对不会被覆盖。

下面是使用array_replace()函数合并数组的示例代码:

$arr1 = array('a' => 1);
$arr2 = array('a' => 2);
$result = array_replace($arr1, $arr2);
print_r($result);

在上面的示例中,合并后的数组将会输出Array ( [a] => 2 )。这是因为第二个数组$arr2中的键值对'a' => 2覆盖了第一个数组$arr1中的键值对'a' => 1

通过使用array_replace()函数,我们可以避免重复的键值对被覆盖,从而得到我们期望的输出。

0
0 Comments

这篇文章将讨论如何在PHP中合并两个关联数组,以便在所有情况下都不会覆盖任何重复的条目。问题的原因是使用数组的加法运算符+$array1 + $array2会返回两个数组的并集。如果它们是关联数组,那么左操作数的值将优先选择,如果键冲突的话。因此,这不是你想要的解决方案,因为会丢失一些值。

有一种方法可以解决这个问题。这个方法是使用一个更复杂的数据结构,即数组的数组。通过这种方式,可以将重复键的值累积起来,而不是覆盖它们。下面是一个示例代码:

$a1 = array('a' => 1, 'b' => 2, 'c' => 3);
$a2 = array('a' => 3, 'b' => 2, 'd' => 2);
$a3 = array(
    'a' => array(1, 3),
    'b' => array(2, 2),
    'c' => array(3),
    'd' => array(2)
);

在这个例子中,我们创建了两个关联数组$a1和$a2。然后,我们使用$a3数组将它们合并起来,其中$a3数组的值是一个由重复键的值组成的数组。

为了更方便地执行这个任务,我们可以编写一个名为lossless_array_merge的函数。这个函数将接受任意数量的数组作为参数,并返回一个合并后的数组,其中重复键的值被累积在一个数组中。下面是这个函数的代码:

function lossless_array_merge() {
  $arrays = func_get_args();
  $data = array();
  foreach ($arrays as $a) {
    foreach ($a as $k => $v) {
      $data[$k][] = $v;
    }
  }
  return $data;
}

这个函数使用了PHP的内置函数func_get_args()来获取所有传递给它的参数,并将它们存储在一个名为$arrays的数组中。然后,我们创建一个空数组$data来存储合并后的结果。通过循环遍历$arrays数组中的每个数组,我们可以将重复键的值累积在$data数组中。

最后,我们返回合并后的数组$data作为函数的结果。

这就是这个函数的工作原理。通过使用这个函数,我们可以在合并两个关联数组时避免覆盖重复的条目。

希望通过阅读本文,你能理解如何通过使用一个更复杂的数据结构和相关的函数来解决合并关联数组时的重复值覆盖问题。如果你有自己的测试数据,你可以尝试使用这个函数来验证它的工作原理。

0