关于 PHP 中数组的 == 和 === 之间的区别是什么?

3
我正在阅读有关PHP的内容,它说:
“==”表示相等,如果$a和$b具有相同的元素,则当$a和$b具有相同的元素时是“true”。
“===”表示恒等,当$a和$b具有相同顺序、相同类型的元素时,则为“true”。
因此,我想自己尝试并编写了这个小脚本:
$a = array(1, 2, 3);
$b = array(2, 3, 1);
if ($a==$b) {echo "yeehaw!";} else {echo "nope";}
if ($a===$b) {echo "yup";} else {echo "nope";}

我曾认为,两个数组相等并不需要顺序相同。然而,当我运行这段代码时,输出却是"nope"和"nope"。

这到底有什么区别呢?


可能是 php == vs === 操作符的重复问题 - hjpotter92
1
@hjpotter92 不是重复,他在谈论数组。 - user1646111
@hjpotter92 我看了潜在重复的答案,似乎是关于标量运算符的,我问的是关于数组运算符、相等性和身份 WRT 数组内部排序的问题。 - Michael Pitluk
所以你想说你不能理解 PHP 手册中直截了当的描述?http://php.net/language.operators.array 那么文档给你带来了哪些其他概念呢?到目前为止,你还没有概述。你期望数组是什么样子的,展示它们是什么样子的,展示你的期望是否符合实际。这些重要的部分都缺失了。 - hakre
1
可能是重复的问题:PHP - 检查两个数组是否相等 - Deepu
@Deepu 这个问题是相关的,但不是重复的。 - Ja͢ck
6个回答

5

文档[PHP.net] 上说:

== TRUE if $a and $b have the same key/value pairs.
=== TRUE if $a and $b have the same key/value pairs in the same order and of the same types.

因为你的两个数组不是按照相同顺序排列1,所以它们没有相同的键-值对。

var_dump($a);
array(3) { 
    [0]=> int(1) 
    [1]=> int(2) 
    [2]=> int(3) 
}
var_dump($b);
array(3) { 
    [0]=> int(2) 
    [1]=> int(3) 
    [2]=> int(1) 
}

1 关于使用array()来构建它们,它会从0开始为每个参数进行编索引。


5
你提供的数组具有相同的值集,但是不同的键值对。
请尝试以下用例(相同的键值对,但顺序不同):
$a = array(0=>1, 1=>2, 2=>3);
$b = array(1=>2, 2=>3, 0=>1);

...以及以下用例(不同数据类型):

$a = array(1, 2, 3);
$b = array('1', '2', '3');

@AlexShesterov 我运行了我的测试,得到了我想要的结果。感谢您提供不同数据类型的示例! - Michael Pitluk

4

我的想法是,两个数组相等并不需要相同的顺序。

为了清楚起见,让我们看一下实际的数组内容,这是文档中所指的相同键/值对:

$a = array(
    0 => 1,
    1 => 2,
    2 => 3,
);
$b = array(
    0 => 2,
    1 => 3,
    2 => 1,
);

显然,这些对是不同的。

那么“相同顺序”呢?

为了说明这一点,让我们稍微改变一下$b

$b => array(
    2 => 3,
    1 => 2,
    0 => 1,
);

== 相等性成立是因为这些对现在相同了。然而,由于 PHP 中的数组是有序映射,对中的顺序差异会导致 === 相等性失败。


0

如果两个数组满足以下条件,则被认为是相同的===

  • 元素数量相同
  • 所有数据类型相同
  • 所有元素顺序相同
  • 每个数组具有相同的键值对

0
“有什么区别?”
两个数组之间的差异可能意味着不同的事情,因此最好使用与您期望匹配的数组差异函数来回答这个问题。
在您的情况下,相等性(可能)由array_diff()函数满足:
!array_diff($a, $b) && !array_diff($b, $a);

如果你说不是我要找的,那么请看重复的问题"PHP - Check if two arrays are equal"。我还在那里留下了一个扩展答案,展示了其他可能的差异以及如何测试这些差异,因为你关心比较值而不是元素(它们是键/值对)。


-1

第一个失败是因为元素不同。第二个失败是因为元素虽然类型相同但不同。(两者应该相同)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接