【问题标题】:Merge two arrays without replacing values合并两个数组而不替换值
【发布时间】:2011-11-29 13:08:30
【问题描述】:

我有点迷茫,或者头脑没有按应有的方式工作。我阅读了其他问题,但可以让我的工作。

我得到了这个数组:

Array
(
    [89] => Array
        (
            [0] => 16
            [1] => 2
        )

)

我得到了这个:

Array
(
    [84] => Array
        (
            [0] => 2
        )

    [83] => Array
        (
            [0] => 2
        )

    [87] => Array
        (
            [0] => 2
            [1] => 3
        )

    [88] => Array
        (
            [0] => 2
        )

    [89] => Array
        (
            [0] => 2
        )

    [90] => Array
        (
            [0] => 2
        )

)

我应该得到所有结果,但在键 89 上我应该从第一个数组中获取值。

Array
(
    [84] => Array
        (
            [0] => 2
        )

    [83] => Array
        (
            [0] => 2
        )

    [87] => Array
        (
            [0] => 2
            [1] => 3
        )

    [88] => Array
        (
            [0] => 2
        )

    [89] => Array
        (
            [0] => 16
            [1] => 2
        )

    [90] => Array
        (
            [0] => 2
        )

)

数组合并不起作用:(。 同样在我得到结果后,如果第一个数组是它的:

Array
(
    [89] => Array
        (
           [1] => 2
        )

)

结果数组应该更新为一条记录。

我确定它对您来说是 1 分钟的代码,但数组对我来说一直很痛苦。

谢谢

更新:如果我使用 array_merge_recursive 它不会保留我的密钥:

print_r(array_merge_recursive($array1,$array2));
Array
(
    [0] => Array
        (
            [0] => 16
            [1] => 2
        )

    [1] => Array
        (
            [0] => 2
        )

    [2] => Array
        (
            [0] => 2
        )

    [3] => Array
        (
            [0] => 2
            [1] => 3
        )

    [4] => Array
        (
            [0] => 2
        )

    [5] => Array
        (
            [0] => 2
        )

    [6] => Array
        (
            [0] => 2
        )

)

【问题讨论】:

  • 您需要发布用于合并的 PHP 代码。
  • 仅仅递归的数组不会保留键,因为它们是数字的......尝试在它们后面附加一个字符串前缀,它应该可以工作......这就是男人所说的:If the input arrays have the same string keys, then the values for these keys are merged together into an array, and this is done recursively, so that if one of the values is an array itself, the function will merge it with a corresponding entry in another array too. If, however, the arrays have the same numeric key, the later value will not overwrite the original value, but will be appended. 跨度>

标签: php arrays multidimensional-array


【解决方案1】:

array_merge_recursive 应该做这项工作;查看文档以获取更多指示:http://www.php.net/manual/en/function.array-merge-recursive.php

编辑 该函数的行为与我最初想象的不同,这里有一个不同版本的函数来解决您的问题:

function array_merge_recursive_distinct(array &$array1, array &$array2) {
  $merged = $array1;

  foreach($array2 as $key => &$value) {
    if(is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
      $merged[$key] = array_merge_recursive_distinct($merged[$key], $value);
    } else {
      $merged[$key] = $value;
    }
  }

  return $merged;
}

感谢php.net社区http://www.php.net/manual/en/function.array-merge-recursive.php#92195

【讨论】:

  • 伟大的科尔基!!这在添加值时有效,但我怎样才能让它在第二种情况下工作?我的意思是我运行它一次并将值添加到键 89 ,但现在我给出一个新数组,键 89 上只有一个值。新的结果数组应该删除不再存在的值...
  • 这不再是数组合并了!
  • 那么我真正需要的是一个函数来比较两个数组并用第一个数组的值更新第二个数组?我要为此再开一个问题吗?
  • 我通过函数 array_merge_recursive_distinct( $array1, $array2) { $merged = $array1; foreach($array2 as $key => $value) { if(array_key_exists($key,$array1)){ unset($merged[$key]); $merged[$key]=$value; } } 返回 $merged; }
【解决方案2】:

如果我理解正确,adding arrays 就足够了:

$result_array = $array1 + $array2;

array_merge 相比,它不会覆盖第一个数组中的值,也不会重新编号数字键。

【讨论】:

    【解决方案3】:
    $newarray=array();
    
    foreach(array_merge($array1,$array2) as $k=>$arr){
        $newarray[$k]=array_merge($array1[$k],$array2[$k]);
    }
    

    【讨论】:

      【解决方案4】:
      foreach($firstArr as $key=>$val){
          if(in_array($key,$secondArray)){
              $secondArray[$key] = $firstArr[$key];
          }
      }
      

      试试这个可能对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-26
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2013-09-12
        • 2017-05-09
        • 2018-04-14
        相关资源
        最近更新 更多