【问题标题】:Merging two arrays, overwriting first array with second one合并两个数组,用第二个数组覆盖第一个数组
【发布时间】:2012-03-31 04:45:29
【问题描述】:

我想合并两个数组,其中包含文件列表以及括号中的修订。

例如:

拳阵:

0 => A[1], 1 => B[2], 2 => C[2], 3 => D[2]

第二个,

0 => B[3], 1 => C[4], 2 => E[4], 3 => F[2], 4 => G[2]

就像我说的,我可以合并两个数组,但是用第二个数组中的数据覆盖第一个数组。

我使用这个正则表达式只获取文件名(删除修订号)。我不知道我在这一点上是否正确):

/\[[^\)]+\]/

我要找的结果是这样的,

0 => A[1], 1 => B[3], 2 => C[4], 3 => D[2], 4 => E[4], 5 => F[2], 6 => G[2]

另外,我差点忘了,整个事情都是用 PHP 编写的。

【问题讨论】:

  • array_merge 在我的情况下不起作用,因为我需要覆盖现有数据。此外,我需要处理与文件相关的修订号(在一个大字符串中)。

标签: php regex arrays php4


【解决方案1】:

类似:

function helper() {
  $result = array();

  foreach (func_get_args() as $fileList) {
    foreach ($fileList as $fileName) {
      list($file, $revision) = explode('[', $fileName, 2);
      $revision = trim($revision, ']');
      $result[$file] = !isset($result[$file]) ? $revision : max($result[$file], $revision);
    }
  }

  foreach ($result as $file => $revision) {
    $result[$file] = sprintf('%s[%s]', $file, $revision);
  }

  return array_values($result);
}

$a = array('A[1]', 'B[2]', 'C[2]', 'D[2]');
$b = array('B[3]', 'C[4]', 'E[4]', 'F[2]', 'G[2]');

print_r(helper($a, $b));

演示:http://codepad.org/wUMMjGXC

【讨论】:

  • 您之前发布的代码运行良好!我忘了提,但我们仍然在这里使用 PHP4 :( 但是感谢您的回答,它运行良好。
  • 再次更改(有点)。我想它也应该在 php4 中工作。 func_get_args() 部分可能有问题。可能是您必须使用额外的变量而不是直接使用结果。
  • 这个版本在PHP4下完美运行。非常感谢您的帮助 !非常感谢
【解决方案2】:

一种方法是将两个数组映射到

filename => filename[revision]

这样

Array
(
    [0] => A[1]
    [1] => B[2]
    [2] => C[2]
    [3] => D[2]
)

变成

Array
(
    [A] => A[1]
    [B] => B[2]
    [C] => C[2]
    [D] => D[2]
)

然后使用array_merge(覆盖具有相同键的条目)。

类似:

function map($array) {
    $filenames = array_map(function($value) {
        return strstr($value, '[', false);
    }, $array);
    return array_combine($filenames, $array);
}

$result = array_merge(map($array1), map($array2));

如果你想有数字索引,你可以在结果上调用array_values。上面的代码需要 PHP 5.3,但它应该很容易使其与早期版本兼容。另一个需要注意的是,它仅在文件名在数组中唯一的情况下才有效。

DEMO(PHP 5.2 版本)

参考:array_mapstrstrarray_combinearray_merge

【讨论】:

  • 非常感谢您的回答,但我忘了说我们这里还在使用 PHP4 :(
  • 是的,我注意到 :D 我仍然会将答案留给不使用 PHP 4 的其他人;)
【解决方案3】:

你可以使用union operator:

$newArray = $arr1 + $arr2;

你是对的,array_merge 只有当你的键是字符串时才有效。使用数字键时,第二个数组只会附加到第一个数组,而不会覆盖重复的键。

【讨论】:

  • 我用联合运算符得到这个结果:0 => A[1], 1 => B[2], 2 => C[2], 3 => D[2], 4 => G[2] :(
  • 您是否尝试过颠倒顺序($arr2 + $arr1)?它是这样工作的:“+ 运算符返回附加到左侧数组的右侧数组;对于两个数组中都存在的键,将使用左侧数组中的元素,并从右侧数组将被忽略”。
  • @bfavaretto:键在这里没有任何作用。这是关于条目的。这个问题没有简单的解决方案。
猜你喜欢
  • 2021-09-12
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多