合并两个阵列,用第二个阵列覆盖第一个阵列

问题描述:

我想合并两个数组,其中包含文件列表及其修订版的括号。合并两个阵列,用第二个阵列覆盖第一个阵列

例如:

拳阵列:

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中。

+0

的http:// PHP 。net/array_merge – bfavaretto 2012-03-14 17:19:20

+1

array_merge在我的情况下不起作用,因为我需要覆盖现有的数据。另外,我需要处理与这些文件相关的修订号(以一个大字符串)。 – 2012-03-14 17:21:34

类似:

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

+0

您发布的代码完美无瑕!我忘了提及,但我们仍然在这里使用PHP4 :(但谢谢你的回答,它完美地工作。 – 2012-03-14 17:35:13

+0

再次更改(一点)。我想它也应该在php4中工作。 'func_get_args()'部分可能有问题。可能是因为你必须使用额外的变量而不是直接使用结果。 – Yoshi 2012-03-14 17:37:26

+0

这个版本在PHP4下工作得很好。非常感谢您的帮助 !不胜感激 – 2012-03-14 17:39:55

您可以使用union operator

$newArray = $arr1 + $arr2; 

你是对的,array_merge只会工作,如果你的钥匙是串。使用数字键,第二个数组将被添加到第一个数组中,而不会覆盖重复的键。

+0

我用union算子得到这个结果:0 => A [1],1 => B [2],2 => C [2],3 => D [2],4 => G [2] :( – 2012-03-14 17:28:03

+0

是否尝试颠倒顺序('$ arr2 + $ arr1')?这是如何工作的:“+运算符返回右手数组附加到左手数组;对于两个键都存在数组中,将使用来自左侧数组的元素,而右侧数组中的匹配元素将被忽略“ – bfavaretto 2012-03-14 17:32:00

+0

@bfavaretto:这里的键不起作用,它是关于**值* *的条目。这个问题没有一个简单的解决方案。 – 2012-03-14 17:42:00

一种方式将是对两个阵列映射到

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

+0

非常感谢您的回答,但我忘了提及,我们仍然在这里使用PHP4 :( – 2012-03-14 17:45:03

+0

是啊,我注意到:DI仍然会留下答案其他人不使用PHP 4;) – 2012-03-14 17:45:32