【发布时间】:2011-01-09 13:49:33
【问题描述】:
$arr[] = array('A','B');
$arr[] = array('C','B');
...
我需要得到$arr的所有子数组的合并结果。
对于重复的条目,应该只获取一个。
【问题讨论】:
标签: php arrays unique flatten array-merge
$arr[] = array('A','B');
$arr[] = array('C','B');
...
我需要得到$arr的所有子数组的合并结果。
对于重复的条目,应该只获取一个。
【问题讨论】:
标签: php arrays unique flatten array-merge
如果你真的不想循环,试试这个:
$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 会在找到任何重复键时覆盖。有人可以回复我吗?
好的,通过另一个问题我发现如果您使用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 正在做什么)至少不比显式循环慢。
【讨论】:
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);
【讨论】:
$merged_array = array_reduce($serp_res, 'array_merge', array()); 增加了配额,'array_merge',为我工作。
【讨论】:
此答案基于 Felix Kling 的帖子。 修复“非数组”子元素是更准确的版本。
$res = array_reduce($res, function(&$res, $v) {
return array_merge($res, (array) $v);
}, array());
【讨论】:
对于带有 splat 运算符的 PHP 5.6:
array_unique(array_merge(...$arr));
【讨论】:
在 PHP 版本 >= 5.6 中处理此问题的一种简单方法是使用 splat 运算符,也称为 Argument Unpacking。
$arr = array_unique(array_merge(...$arr));
【讨论】: