【问题标题】:PHP array_merge with numerical keysPHP array_merge 与数字键
【发布时间】:2011-08-21 05:46:22
【问题描述】:

如何使 array_merge() 覆盖两个数组中具有不同值但相同键索引的两个键?

例如合并:

[0] => 'whatever'

[0] => 'whatever', [1] => 'a', [2] => 'b'

应该产生

[0] => 'whatever', [1] => 'a', [2] => 'b'

基本上,如果数组具有字符串键,我希望 array_merge 具有相同的行为方式...

【问题讨论】:

  • 您描述的是array_merge,但您的示例说明了数组添加。这很清楚,因此也不是答案。如果您真的在寻找替代 array_merge 的数字键,那么正确的答案是下面的@HKandulla 给出的this one

标签: php arrays array-merge


【解决方案1】:

很容易手动编写:

function array_merge_custom($first, $second) {
    $result = array();
    foreach($first as $key => $value) {
        $result[$key] = $value;
    }
    foreach($second as $key => $value) {
        $result[$key] = $value;
    }

    return $result;
}

更新:这与联合运算符 (return $first + $second;) 的行为不同,因为在这种情况下,second 数组在两个元素具有相同键时获胜。

但是,如果您切换参数的位置并将在发生冲突时想要“获胜”的数组作为 first 操作数,您可以获得相同的行为。所以上面的函数的行为就像return $second + $first;

【讨论】:

  • 这和$second + $first 不完全一样。我无法在此处进行格式化,因此我将发布一个答案以使其更清晰。
【解决方案2】:

您可以使用array_merge(),然后使用array_unique()

【讨论】:

  • 如果您的价值观有可能不是唯一的,这不是一个好的解决方案。
【解决方案3】:

使用+ 运算符。

比较array_merge+ 运算符:

<?php

$a1 = array(0=>"whatever",);
$a2 = array(0=>"whatever",1=>"a",2=>"b");

print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>

输出:

Array
(
    [0] => whatever
    [1] => whatever
    [2] => a
    [3] => b
)
Array
(
    [0] => whatever
    [1] => a
    [2] => b
)

+ 运算符仍然在您的关联数组的数字键乱序时有效:

<?php

$a1 = array(0=>"whatever",);
$a2 = array(1=>"a",0=>"whatever",2=>"b");

print_r(array_merge($a1,$a2));
print_r($a1+$a2);
?>

输出:

Array
(
    [0] => whatever
    [1] => a
    [2] => whatever
    [3] => b
)
Array
(
    [0] => whatever
    [1] => a
    [2] => b
)

通知array_merge这种 的情况下会创建一个新密钥。不可取...

【讨论】:

  • 您可能希望使用不同的值来证明“+”保留左数组值,而 array_merge 使用右数组值(用于重复键的情况)。
  • 注意:如果您使用array $a1 + array $a2 - 您将获得正确的数据,如果键相同(即使是索引数组),$a1 将覆盖 $a2 值,但是:json_encode() 的当前sum 将返回对象 - 而不是数组!!! array_values($a1+$a2) 将返回混洗结果,依此类推,依此类推……,最好再写一个循环并手动合并……(我在写这里之前检查了它,就在一分钟前找到了一些麻烦为什么JS插件不想工作的问题...)
  • @LINKeRxUA 我宁愿在联合后的数组上运行ksort,也不愿添加一个六行函数来处理该特定用例。
  • 如果 PHP 大神正在阅读这个 array_merge 应该只是有一个复制 $arr1+$arr2 行为的标志。这有点傻
  • 这不是问题的答案,array_merge 将用以后的值替换重复的键,除非键是数字。正确的答案是使用@HKandulla below 给出的array_replace
【解决方案4】:

在我的项目中,我使用自己的函数

function array_merge_custom(){
    $array = [];
    $arguments  = func_num_args();
    foreach($arguments as $args)
        foreach($args as $key => $value)
            $array[$key] = $value;
    return $array;
}

用法

$a = array_merge_custom($b, $c, $d, ... .. )

【讨论】:

    【解决方案5】:

    您应该使用$a2+$a1 来获得与array_merge($a1,$a2); 相同的结果

    $a1 = array(
        'k1' => 1,
        'k2' => 2,
        'k3' => 3,
    );
    
    $a2 = array(
        'k1' => 11,
        'k2' => 22,
        'k4' => 44,
    );
    

    代码:

    print_r(array_merge($a1,$a2));
    

    输出:

    Array ( 
        [k1] => 11 
        [k2] => 22 
        [k3] => 3 
        [k4] => 44 
    )
    

    代码:

    print_r($a1+$a2);
    

    输出:

    Array ( 
        [k1] => 1 
        [k2] => 2 
        [k3] => 3 
        [k4] => 44 
    )
    

    代码:

    print_r($a2+$a1);
    

    输出:

    Array ( 
        [k1] => 11 
        [k2] => 22 
        [k4] => 44 
        [k3] => 3 
    ) 
    

    【讨论】:

      【解决方案6】:
      the solution could be this:
      function array_merge_custom($array1, $array2) {
          $mergeArray = [];
          $array1Keys = array_keys($array1);
          $array2Keys = array_keys($array2);
          $keys = array_merge($array1Keys, $array2Keys);
      
          foreach ($keys as $key) {
              $mergeArray[$key] = array_merge_recursive(isset($array1[$key]) ? $array1[$key] : [], isset($array2[$key]) ? $array2[$key] : []);
          }
      
          return $mergeArray;
      }
      
      $array1 = [
          '66_' => [
              'k1' => 1,
              'k2' => 1,
          ],
          '67_' => [
              'k1' => 1,
              'k2' => 1,
          ],
          '68_' => [
              'k1' => 1,
              'k2' => 1,
          ],
          68 => [
              'k1' => 1,
              'k2' => 1,
          ]
      ];
      $array2 = [
          '66_' => [
              'a1' => 1,
              'a2' => 1,
          ],
          '68_' => [
              'b1' => 1,
              'b2' => 1,
          ],
          68 => [
              'b1' => 1,
              'b2' => 1,
          ]
      ];
      echo '<pre>';
      print_r(array_merge_custom($array1, $array2));
      

      【讨论】:

        【解决方案7】:

        array_replace 正是这样做的!

        【讨论】:

          【解决方案8】:
          $arrA = [10, 11, 12];
          $arrB = [12, 13];
          
          $arrCommon = array_keys(array_flip($arrA) + array_flip($arrB));
          
          print_r($arrCommon);
          Array
          (
              [0] => 10
              [1] => 11
              [2] => 12
              [3] => 13
          )
          

          比较错误使用“+”

          $arrCommon = $arrA + $arrB;
          
          print_r($arrCommon);
          Array
          (
              [0] => 10
              [1] => 11
              [2] => 12
          )
          

          【讨论】:

            猜你喜欢
            • 2012-07-23
            • 1970-01-01
            • 1970-01-01
            • 2011-07-11
            • 2018-06-30
            • 2012-09-06
            • 2011-10-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多