【问题标题】:Merge arrays containing shared associative keys without overwriting each other合并包含共享关联键的数组而不相互覆盖
【发布时间】:2015-09-22 03:15:32
【问题描述】:

我正在使用多个 API 作为平面数组返回数据。所有这些 API 都返回带有共享密钥的数组。

例如:

从 API A、B 和 C 返回数据:

$a = array(1 => "abc", 2 => "def");
$b = array(1 => "ghi", 2 => "jkl");
$c = array(1 => "mno", 2 => "pqr");

所有这些数组都有重复的数字键。我的要求是单个数组不会因键冲突而丢失值。

要求的结果:

array(
    "abc",
    "def",
    "ghi",
    "jkl",
    "mno",
    "pqr"
);

我尝试了array_merge() 函数,但它覆盖了重复的键,array_merge_recursive() 函数将所有重复的键累积到另一个数组中。

【问题讨论】:

  • 您的示例似乎与您的要求不一致,因为它确实会像 array_merge() 那样覆盖键,忽略从 1 开始的索引。
  • 我将array_merge() 与您的变量数组一起使用,它在没有覆盖的情况下运行良好(但是从0 开始而不是1)。

标签: php arrays array-merge


【解决方案1】:

试试这个......

$a=array(1=>"abc",2=>"def");
$b=array(1=>"ghi",2=>"jkl");
$c=array(1=>"mno",2=>"pqr");

$d = array();

foreach($a as $arr){
 array_push($d, $arr);
}

foreach($b as $arr){
 array_push($d, $arr);
}

foreach($c as $arr){
 array_push($d, $arr);
}
print_r($d);

输出是

Array ( [0] => abc [1] => def [2] => ghi [3] => jkl [4] => mno [5] => pqr )

我还用数组合并尝试了你的示例,它给了我以下 o/p。

Array ( [0] => abc [1] => def [2] => ghi [3] => jkl [4] => mno [5] => pqr )

【讨论】:

  • 感谢 Rohit,array_push 方法对我有用,虽然 array_merge 在数字键中有效,但不适用于字母数字键。
【解决方案2】:

您可以使用array_mergearray_merge_recursive

对于array_merge,如果您使用的是字符串键,则值将被覆盖,这意味着输出数组中该键只有一个值。

对于array_merge_recursive,如果您使用数字键,则该值将被覆盖,这意味着输出数组中该键将只有一个值

【讨论】:

    【解决方案3】:

    这是创建一个包含所有值的数组的一种相当短的方法,而不管它们的键是什么:

    $z = array_merge(
        array_values($a),
        array_values($b),
        array_values($c)
    )
    

    【讨论】:

      【解决方案4】:

      由于您的键都是数字的,您可以通过在新数组中使用可变参数表达式来“拼凑”数据。这是一个单行程序,绝对不需要函数调用来生成所需的数据结构。

      代码:(Demo)

      $a = [1 => "abc", 2 => "def"];
      $b = [1 => "ghi", 2 => "jkl"];
      $c = [1 => "mno", 2 => "pqr"];
      
      var_export(
          [...$a, ...$b, ...$c]
      );
      

      输出:

      array (
        0 => 'abc',
        1 => 'def',
        2 => 'ghi',
        3 => 'jkl',
        4 => 'mno',
        5 => 'pqr',
      )
      

      array_merge() 提供相同的结果。 (Demo)

      var_export(array_merge($a, $b, $c));
      

      三种语言结构会做同样的事情。 (Demo)

      $result = [];
      foreach ($a as $result[]);
      foreach ($b as $result[]);
      foreach ($c as $result[]);
      var_export($result);
      

      或者,如果您希望合并结果数组中的键从 1 开始,您可以在单个 array_push() 调用中使用可变参数表达式。 (Demo)

      array_push($a, ...$b, ...$c);
      var_export($a);
      

      输出:

      array (
        1 => 'abc',
        2 => 'def',
        3 => 'ghi',
        4 => 'jkl',
        5 => 'mno',
        6 => 'pqr',
      )
      

      您不能使用数组联合运算符,因为它们会由于键冲突而破坏元素。 (Demo)

      var_export($a + $b + $c);
      

      输出错误:

      array (
        1 => 'abc',
        2 => 'def',
      )
      

      【讨论】:

        猜你喜欢
        • 2013-12-31
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 1970-01-01
        • 2013-07-11
        • 1970-01-01
        • 1970-01-01
        • 2021-07-01
        相关资源
        最近更新 更多