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

Posted

技术标签:

【中文标题】如何合并子数组值并删除重复项?【英文标题】:How to merge subarray values and remove duplicates? 【发布时间】:2011-01-09 13:49:33 【问题描述】:
$arr[] = array('A','B');
$arr[] = array('C','B');
...

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

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

【问题讨论】:

【参考方案1】:

如果你真的不想循环,试试这个:

$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 会在找到任何重复键时覆盖。有人可以回复我吗? 没有 'array_merge' 会出现以下错误“ErrorException: call_user_func_array() 只需要 2 个参数”@Ankit 天才,我们可以实际使用 call_user_func_array 的罕见情况之一,它非常适合这种事情。【参考方案2】:

好的,通过另一个问题我发现如果您使用PHP版本> = 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 正在做什么)至少比显式循环慢。

【讨论】:

我不认为 $merged_array = array_merge($arr);实际上会分解子数组,我很确定这是 OP 所要求的。 值得注意的是,array_merge 应该用引号括起来,例如'array_merge'【参考方案3】:
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个以上的子数组。 子数组的个数是动态的。 尽管作者只给出了 $arr 0 + 1 作为示例,但我认为他们需要一个解决方案来容纳 $arr 的所有子项。 除了循环还有其他方法吗? 为什么?循环有什么问题?我想你可以使用某种映射功能。查看 php 文档的数组部分以了解其他想法。 php.net/manual/en/ref.array.php【参考方案4】:

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

【讨论】:

【参考方案5】:

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

$res = array_reduce($res, function(&$res, $v) 
                            return array_merge($res, (array) $v);
                        , array());

【讨论】:

很好的解决方案,并使用 array_filter() 摆脱由空数组值或先前添加的字符串引起的空数组元素。这是最终版本: $res = array_filter(array_reduce($res, function(&$res, $v) return array_merge($res, (array) $v);, array()));【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

以上是关于如何合并子数组值并删除重复项?的主要内容,如果未能解决你的问题,请参考以下文章

删除对象数组重复项并将非重复值存储在数组中

合并两个 Eloquent Collections 并删除所有重复项。

xslt2+ 如何将组与任何匹配的元素组合并删除元素的重复项

NodeJS:如何从数组中删除重复项[重复]

如何从二维数组中删除重复项? [关闭]

Python 3 - 合并 .xls/删除行/删除重复项