PHP数组比较运算符未按预期工作

时间:2018-01-17 11:44:03

标签: php arrays

我必须使用数组并想检查它们是否具有相同的值,而不是顺序,所以我使用了==运算符:

$roles = ['admin', 'manager'];
$needle = ['manager', 'admin'];

$needle == $roles; // false

问题在于,使用相同的值但顺序不同,操作员会将比较评估为false

如何正确比较两个数组以检查值是否相同?

更新

目前,我正在使用array_intersect

$hasExactRoles = (
  (array_intersect($roles, $needle) === $roles) &&
  (array_intersect($needle, $roles) === $needle)
);

3 个答案:

答案 0 :(得分:4)

<击> 您可以检查数组之间的区别。

$roles = ['admin', 'manager'];
$needle = ['manager', 'admin'];

if (empty(array_diff($roles, $needle))) {
    echo 'The same.';
}

<击>

正确答案是:

$roles = ['admin', 'manager'];
$needle = ['manager', 'admin'];

sort($roles);
sort($needle);

if ($roles === $needle) {
    echo 'The same.';
}

答案 1 :(得分:2)

如果$ a和$ b具有相同的键/值对,

==数组的计算结果为在您的示例中,数字键0和{{1与不同的值匹配,因此比较失败。

正如其他人所提到的,您可以使用1来比较这些值,例如

array_diff

但请注意if (count(array_diff($needle, $roles)) > 0) { // Arrays are not identical } 仅在一个方向上工作 - 它会返回第二个中的第一个参数中的值,因此您可能会还需要以相反的顺序运行它,具体取决于您的具体情况。

正如@axiac在评论中提到的,这仍然不能涵盖元素可以多次出现的情况。如果这适用,那么可能有更好的方法可以解决这个问题,例如:通过对数组进行排序或使用array_diff等函数。

答案 2 :(得分:-2)

使用array_diff函数返回第二个数组中不在第一个数组中的任何值。如果array_diff为空,那么数组是相同的:

$roles = ['admin', 'manager'];
$needle = ['manager', 'admin'];
$result = array_diff($roles, $needle);
if (empty($result)) {
    // Arrays are the same
}