我想合并两个包含文件列表及其括号内修订版的数组。
例如:
拳阵:
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 :(得分:4)
类似的东西:
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));
答案 1 :(得分: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版)
答案 2 :(得分:1)
您可以使用union operator:
$newArray = $arr1 + $arr2;
你是对的,array_merge
只有在你的钥匙是字符串的情况下才有效。使用数字键,第二个数组将仅附加到第一个数组,而不会覆盖重复键。