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

我需要得到所有子数组的合并结果$arr

对于重复的条目,应该只获取一个。

4

7 回答 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));
于 2010-01-26T19:49:08.827 回答
15

好的,通过另一个问题,我发现如果您使用PHP version >= 5.3.0 ,以下实际上是可能的(我自己试过但没有成功,我有错误的版本) :

$merged_array = array_reduce($arr, 'array_merge', array());

如果您只想要唯一值,您可以申请array_unique

$unique_merged_array = array_unique($merged_array);

如果数组中只有平面元素(即没有其他数组),则此方法有效。从文档中:

注意:请注意,这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正在做什么)至少不比显式循环慢。

于 2010-01-26T16:45:51.010 回答
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);
于 2010-01-26T15:54:58.717 回答
1

这个答案基于 Felix Kling 的帖子。这是更准确的版本,修复了“非数组”子元素。

$res = array_reduce($res, function(&$res, $v) {
                            return array_merge($res, (array) $v);
                        }, array());
于 2014-11-27T12:53:27.603 回答
1

$merged_array = array_reduce($serp_res, 'array_merge', array()); 增加了配额,'array_merge',为我工作。

于 2012-01-31T13:34:13.457 回答
1

在 PHP 版本中处理此问题的一种简单方法>= 5.6是使用 splat 运算符,也称为Argument Unpacking

$arr = array_unique(array_merge(...$arr));
于 2017-11-22T15:56:00.750 回答
1

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

array_unique(array_merge(...$arr));
于 2017-09-12T03:05:26.253 回答