php - 如何在 php 中组合 2 个关联数组,这样我们就不会在所有情况下覆盖任何重复的条目?

标签 php arrays

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

我试过使用 array_merge 但如果第二个数组中有任何重复项,它会覆盖第一个数组中的条目,我也尝试过使用 + 但它给我 fatal error 说 Fatal error :/home/code.php 中不支持的操作数类型 然后我尝试做

(array)$ar3 = (array)$ar1 +(array)$ar2 它似乎加起来了。我想知道这是否是正确的方法,以及为什么一开始我会遇到 fatal error ,但它却能正常工作,因为我已经将 $ar3、$ar2、$ar1 定义为数组类型。

$orders = new Order(); 
$prospectOffers = $orders->getOrder($orderConfNumber); 
$prospectOffersResult = json_decode($prospectOffers,true); 
$shoppingBasket = $cart->getCartItems(); 
var_dump($prospectOffersResult); // Both are arrays 
var_dump($shoppingBasket); //Both are arrays 
(array)$result = (array)$prospectOffersResult+(array)$shoppingBasket;

谢谢。

最佳答案

$array1 + $array2 将返回两个数组的并集。如果它们是关联的,则如果键发生冲突,则首选左侧操作数的值。因此,这不是您想要的解决方案,因为值会丢失。

如果两个变量都被理解为数组,则该语句没有任何问题。您可能会发生 fatal error ,因为一个变量实际上是一个对象,并且可能会误认为使用 var_dump。通过添加类型转换,您强制 PHP 将两个变量强制转换为数组。如果一个变量是一个对象,它会产生这样的效果:

来自PHP.net Manual

"If an object is converted to an array, the result is an array whose elements are the object's properties. The keys are the member variable names, with a few notable exceptions: integer properties are unaccessible; private variables have the class name prepended to the variable name; protected variables have a '*' prepended to the variable name. These prepended values have null bytes on either side."

现在有两个数组要添加,PHP 没有什么可担心的。请注意,虽然强制转换 + 的两个操作数很重要,但强制转换您要分配给的变量是没有意义的。表达式 (array)$foo 不会修改 $foo,而是返回一个新值。这对于要求您声明变量的语言来说可能不直观,但 PHP 不是这种语言。

关于你的另一个问题,你不能在一个数组中有两个相同的键。这将使索引数组变得不可能,因为要返回的正确值会变得不明确。如果您希望在无损庄园中组合两个数组,您将不得不使用更复杂的数据结构。

我的建议是使用数组的数组,其中:

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

并且顺序未确定。该结构唯一值得注意的变化是所有第一个值都是数组,允许累积重复键的值。这个函数完成任务并且可能用一个更好的名字来完成:

// array(array) lossless_array_merge([$array1 [, $array2 [, $...]]])

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 - 如何在 php 中组合 2 个关联数组,这样我们就不会在所有情况下覆盖任何重复的条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2148694/

相关文章:

php - 用于分割除 URL 之外的字符串的正则表达式

php - 在 magento 中以编程方式创建可配置产品

c - C中删除数组元素

arrays - 使用 NSKeyedArchiver 保存和加载对象数据 - 对象变量更改后数据丢失

c++ - 动态创建包含另一个动态创建的结构数组的结构数组时的内存管理

c++ - 在 std::array 上使用 std::extent

php - 如何添加php环境变量?

php - 通过 PhpExcel 导出 csv 文件时从文本中删除双引号并用记事本打开它

javascript - for 循环后解析数组后未定义

JavaScript - 如何从函数传递/存储值以形成隐藏字段?