我是否有PHP的内置函数来检查两个数组是否包含相同的值(顺序不重要?)。
例如,我想要一个函数,它为以下两个输入返回true:
array('4','5','2')
array('2','4','5')
编辑:我可以对两个阵列进行排序并对它们进行比较,但由于我是一个懒惰的家伙,我仍然更喜欢我可以拔出并使用的单线程。
答案 0 :(得分:30)
array_diff看起来像一个选项:
function array_equal($a1, $a2) {
return !array_diff($a1, $a2) && !array_diff($a2, $a1);
}
或作为代码中的oneliner:
if(!array_diff($a1, $a2) && !array_diff($a2, $a1)) doSomething();
答案 1 :(得分:8)
最好的解决方案是对两个数组进行排序,然后比较它们:
$a = array('4','5','2');
$b = array('2','4','5');
sort($a);
sort($b);
var_dump($a === $b);
作为一项功能:
function array_equal($a, $b, $strict=false) {
if (count($a) !== count($b)) {
return false;
}
sort($a);
sort($b);
return ($strict && $a === $b) || $a == $b;
}
如果它位于 B 中,那么另一个算法会查找 A 的每个元素:
function array_equal($a, $b, $strict=false) {
if (count($a) !== count($b)) {
return false;
}
foreach ($a as $val) {
$key = array_search($val, $b, $strict);
if ($key === false) {
return false;
}
unset($b[$key]);
}
return true;
}
但是它的复杂性为 O ( n ^ 2)。所以你最好使用排序方法。
答案 2 :(得分:3)
上面的array_diff()
方法不起作用。
php.net的手册说array_diff()
执行此操作:
“返回一个数组,其中包含array1中任何其他数组中不存在的所有条目。”
所以实际的array_diff()
方法是:
function array_equal($array1, $array2)
{
$diff1 = array_diff($array1, $array2);
$diff2 = array_diff($array2, $array1);
return
(
(count($diff1) === 0) &&
(count($diff2) === 0)
);
}
但是我选择了排序方法:D
答案 3 :(得分:2)
您可以使用array_diff。
$a = array('4','5','2');
$b = array('2','4','5');
if(count(array_diff($a, $b)) == 0) {
// arrays contain the same elements
} else {
// arrays contain different elements
}
但是,这种方法的一个问题是数组可能包含重复的元素,并且仍然匹配。
答案 4 :(得分:1)
您只需要使用array_diff()
进行单向比较,然后使用count()
进行反转关系。
if (count($a1) == count($a2) && !array_diff($a1, $a2)) {
// equal arrays
}
答案 5 :(得分:0)
您可以使用array_intersect()
代替array_diff()
:
$a = array('4','5','2');
$b = array('2','4','5');
$ca = count($a);
$cb = count($b);
$array_equal = ( $ca == $cb && $ca == count(array_intersect($a, $b)) );
表现明智。解决方案,其中两个因素很重要:
array_intersect()
越快。array_intersect()
越快。根据这些因素,一种方法可能比另一种方法快两到三倍。对于具有很少(或没有)匹配组合的大型数组,或者对于具有大量匹配的小数组,两种方法都是等效的。
但是,排序方法总是更快,除了小数组很少或没有匹配组合的情况。在这种情况下,array_diff()
方法的速度提高了30%。
答案 6 :(得分:0)
如果要比较的数组仅由字符串和/或整数组成,array_count_values
允许您通过验证两者来快速比较数组(在O(n)
时间与O(n log n)
之间进行排序)数组包含相同的值,并且每个值在两个数组中出现的次数相同。
if(array_count_values($a1) == array_count_values($a2)) {
//arrays are equal
}
答案 7 :(得分:0)
作为@knittl 已接受回复的补充
为了涵盖这种情况,当其中一个数组有其他成员时:
nm1 <- setdiff(names(dt), "A")
setnames(dt[, lapply(.SD, sum), A], nm1, paste0('total', nm1))[]
或一行,根据要求(但不是很好)
function areEqualIfOrderIgnored(array $a1, array $a2): bool
{
if (
! array_diff($a1, $a2)
&& ! array_diff($a2, $a1)
&& count($a1) === count($a2)
) {
return true;
}
return false;
}