PHP中是否有一个数组函数以某种方式执行array_merge,比较值,忽略键?我认为array_unique(array_merge($a, $b))
有效,但我相信必须有更好的方法来做到这一点。
例如
$a = array(0 => 0, 1 => 1, 2 => 2);
$b = array(0 => 2, 1 => 3, 2 => 4);
导致:
$ab = array(0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4);
请注意,我并不关心$ab
中的密钥,但是如果它们是提升的话会很好,从0开始到count($ab)-1
。
答案 0 :(得分:13)
最优雅,简单,高效的解决方案是原始问题中提到的解决方案......
$ab = array_unique(array_merge($a, $b));
Ben Lee和Doublejosh在评论中也提到了这个答案,但是我在这里发布它作为一个实际的答案,以便其他人找到这个问题并想知道最佳解决方案是什么阅读本页面上的所有评论。
答案 1 :(得分:3)
function umerge($arrays){
$result = array();
foreach($arrays as $array){
$array = (array) $array;
foreach($array as $value){
if(array_search($value,$result)===false)$result[]=$value;
}
}
return $result;
}
答案 2 :(得分:1)
要回答所提出的问题,对于在保留密钥时也适用于关联数组的一般解决方案,我相信您会发现此解决方案最令人满意:
/**
* array_merge_unique - return an array of unique values,
* composed of merging one or more argument array(s).
*
* As with array_merge, later keys overwrite earlier keys.
* Unlike array_merge, however, this rule applies equally to
* numeric keys, but does not necessarily preserve the original
* numeric keys.
*/
function array_merge_unique(array $array1 /* [, array $...] */) {
$result = array_flip(array_flip($array1));
foreach (array_slice(func_get_args(),1) as $arg) {
$result =
array_flip(
array_flip(
array_merge($result,$arg)));
}
return $result;
}
答案 3 :(得分:-1)
array_merge会忽略数字键,因此在您的示例中array_merge($a, $b)
会为您提供$ab
,因此无需拨打array_unique()
。
如果您有字符串键(即关联数组),请先使用array_values()
:
array_merge(array_values($a), array_values($b));
答案 4 :(得分:-1)
$a = array(0 => 0, 1 => 1, 2 => 2);
$b = array(0 => 2, 1 => 3, 2 => 4);
//add any from b to a that do not exist in a
foreach($b as $item){
if(!in_array($item,$b)){
$a[] = $item
}
}
//sort the array
sort($a);