如何合并子数组的值并删除重复项?

9
$arr[] = array('A','B');
$arr[] = array('C','B');
...

我需要获取 $arr 的所有子数组的合并结果。对于重复的条目,应只获取一个。
7个回答

25

如果你真的不想使用循环,请尝试这个:

$arr[] = array('A','B');
$arr[] = array('C','B');
$arr[] = array('C','D');
$arr[] = array('F','A');
$merged = array_unique(call_user_func_array('array_merge', $arr));

我认为不需要使用array_unique,因为如果发现重复的键,array_merge会覆盖它们。请问有人可以回复我吗? - Ankit
没有使用 'array_merge' 函数会出现以下错误 "ErrorException: call_user_func_array() 函数要求正好有 2 个参数" @Ankit - LeRoy
天才,这是我们实际上可以使用call_user_func_array的罕见情况之一,而且它非常适合这种情况。 - Robert Sinclair

15

通过另一个问题,我发现以下内容实际上是可能的(我尝试过但没有成功,我使用了错误的版本),只要您使用的 PHP 版本>= 5.3.0

$merged_array = array_reduce($arr, 'array_merge', array());
如果您只想要唯一的值,可以使用 array_unique 函数:
$unique_merged_array = array_unique($merged_array);

如果您的数组中只有平面元素(即没有其他数组),则此方法可行。根据文档:

Note: 请注意,array_unique() 不适用于多维数组。

如果您的数组中有包含其他数组,则需要手动检查,例如使用 array_walk

$unique_values = array();

function unique_value($value, &$target_array) {
    if(!in_array($value, $target_array, true))
        $target_array[] = $value;
}

array_walk($merged_values, 'unique_value', $unique_values);

我认为可以假设内部循环(即array_walk在执行的内容)至少不会比显式循环更慢。


1
我认为 $merged_array = array_merge($arr); 实际上不会分解子数组,而这正是 OP 所询问的。 - sprugman
2
值得注意的是,array_merge 应该加上引号,例如 'array_merge'。 - Matthew Riches

8
array_unique(array_merge($arr[0], $arr[1]));

或者对于无限制的情况,我认为这应该有效:
$result_arr = array();
foreach ($arr as $sub_arr) $result_arr = array_merge($result_arr, $sub_arr);
$result_arr = array_unique($result_arr);

它可以有超过2个子数组。 - user198729
尽管作者只举了 $arr 0 + 1 的例子,但我认为他们需要一个解决方案来适应 $arr 的所有子项。 - Ben Everard
为什么?循环有什么问题吗?我想你可以使用某种映射函数。查看 PHP 文档中的数组部分以获取其他想法。http://www.php.net/manual/en/ref.array.php - sprugman
如果数组数量是动态的,我认为循环可能是最好的选择。你为什么不想要一个循环呢? - Anthony Forloney
有没有一个可以处理这个问题的数组函数? - user198729
显示剩余4条评论

1
这个答案基于Felix Kling的帖子。这是一个更准确的版本,修正了“非数组”子元素的问题。
$res = array_reduce($res, function(&$res, $v) {
                            return array_merge($res, (array) $v);
                        }, array());

1
很棒的解决方案,使用array_filter()来消除由之前添加的空数组值或字符串引起的空数组元素。这是最终版本:$res = array_filter(array_reduce($res, function(&$res, $v) {return array_merge($res, (array) $v);}, array())); - Tarik

1

$merged_array = array_reduce($serp_res, 'array_merge', array()); 加上引号的'array_merge'对我很有用。


1
在PHP版本≥5.6中处理这个问题的简单方法是使用splat运算符,也称为参数解包
$arr = array_unique(array_merge(...$arr));

1

对于带有splat运算符的PHP 5.6:

array_unique(array_merge(...$arr));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接