[2,5,3]
[5,2,3]
Run Code Online (Sandbox Code Playgroud)
它们是相同的,因为它们具有相同的值,但不是以相同的顺序.我可以在不使用带有in_array()的foreach循环的情况下找到答案吗?我认为这不会有效率.
use*_*933 66
sort($a);
sort($b);
if ($a==$b) {//equal}
Run Code Online (Sandbox Code Playgroud)
Twi*_*ght 16
派对有点晚了,但希望它有用:
如果您确定数组只包含字符串或两者都只包含整数,那么array_count_values($a) == array_count_values($b)具有更好的时间复杂度.但是,user1844933的答案更为通用.
Con*_*one 12
迟到这个派对.我有同样的问题,但不想排序,这是我知道可行的直接答案.我想出了这个简单的单行程序,它只适用于唯一值的数组:
$same = ( count( $a ) == count( $b ) && !array_diff( $a, $b ) )
Run Code Online (Sandbox Code Playgroud)
它也比排序选项快5倍.这并不是特别慢,所以我想说的更多是关于你的个人偏好以及你认为哪一个更清楚.我个人不愿意排序.
编辑:感谢Ray指出这一事实,这只适用于具有唯一值的数组.
如果您不想对数组进行排序,但只想检查相等而不管值顺序如何,请使用http://php.net/manual/en/function.array-intersect.php,如下所示:
$array1 = array(2,5,3);
$array2 = array(5,2,3);
if($array1 === array_intersect($array1, $array2) && $array2 === array_intersect($array2, $array1)) {
echo 'Equal';
} else {
echo 'Not equal';
}
Run Code Online (Sandbox Code Playgroud)
小智 6
最好的方法是使用array_diff http://php.net/manual/en/function.array-diff.php
$arr1 = [2,5,3];
$arr2 = [5,2,3];
$isEqual = array_diff($arr1,$arr2) === array_diff($arr2,$arr1);
Run Code Online (Sandbox Code Playgroud)
由于给出的答案都不是完全与键无关的重复值(如[1,1,2]equals [1,2,2]),因此我编写了自己的答案。
此变体不适用于多维数组。它确实检查两个数组是否包含完全相同的值,无论它们的键和顺序如何,而不修改任何参数。
function array_equals(array $either, array $other) : bool {
foreach ($other as $element) {
$key = array_search($element, $either, true);
if ($key === false) {
return false;
}
unset($either[$key]);
}
return empty($either);
}
Run Code Online (Sandbox Code Playgroud)
尽管问题询问的是无 foreach 变体,但我找不到任何无需循环即可满足我的要求的解决方案。此外,大多数其他使用的函数也在内部使用循环。
为什么不修改$either?因为 PHP 中的值是写时复制的,所以只要这是它自己的函数$either而不是内联代码,第一次修改参数时就会复制数组。
如果您想内联此代码,请先执行此操作:
$either = $myarray;
// inline code from function above
Run Code Online (Sandbox Code Playgroud)