数组不匹配严格比较

3
$c1 = $v1 = array();
$v1['key'] = 'value';
echo '$c1 === $v1: ' . (($c1 === $v1) ? 'true' : 'false'); // prints false

$c1 === $v1 是错误的。但是为什么呢?看起来 $v1 自动设置为一个不同的数组,它的原始数组自动设置为了另一个数组。为什么会发生这种情况?

最初,$c$v1 被设置为相同的数组实例。所以如果我改变 $v1,那么不应该 $c 反映出这些改变,因为它们都被设置为相同的数组实例。


为什么它应该相等?[] === ['key' => 'value'] - LF00
你给 $v1 赋了一个值,而另一个为空。所以这两个数组不匹配。 - Qirel
你到底想要实现什么?检查两个是否为数组?检查它们是否相等(它们不相等)。 - Qirel
1
你混淆了按值和按引用的赋值方式。在你的 $c1 赋值后,与 $v1 不相等。请查看 http://php.net/manual/zh/language.references.php 和 https://eval.in/815043。 - chris85
@sohan,我冒昧地修改了你的问题标题。 "Bizzare PHP issue" 不是很有帮助或描述性 - 请随意将其更改为更合适的内容! - Qirel
3个回答

4

这两个变量不同,因为你明确设置它们持有不同的值。第一个是空的,而第二个则存储了数值。

它们没有被设置为相同的 引用,所以它们是两个不同的变量——当你执行操作时:

$c1 = $v1 = array();

你创建了两个不同的数组。如果你希望对其中一个数组进行更改,同时反映在两个数组中,你需要通过在变量标识符前使用 & 操作符来使其成为引用类型。

$v1 = array();
$c1 = &$v1; // $c1 is now a reference to $v1
$v1['key'] = 'value';
echo '$c1 === $v1: ' . (($c1 === $v1) ? 'true' : 'false'); // true!

请注意,您需要在要引用的变量被创建之后才能引用它。
使用此类引用时,双方都会受到影响 - 对$v1的任何更改都将应用于$c1,反之亦然。因此,它们是不同的变量,但始终保持相同的值。
上面例子中的比较成立,因为数组完全相同 - 不仅仅是通过引用,而且还因为它们具有相同的值和键。如果您比较两个非引用数组,具有完全相同的值和匹配的键,那么您也会得到真正的平等。
var_dump(array('foo') === array('bar'));           // false; same keys, different values
var_dump(array('bar') === array('bar'));           // true;  same keys, same values
var_dump(array('bar') === array('baz' => 'bar'));  // false; different keys, same value

演示实例


0

这些数组不同,因为第二个数组有一个值。请运行以下代码:

<?php
$a = $b = [];

print_r($a);
print_r($b);

$result = ($a === $b) ? 1 : 0;

// The reasult will be 1 because the arrays are both empty.
print_r($result);

$b[0] = 'Ravi';

print_r($a);
print_r($b);

$result = ($a === $b) ? 1 : 0;

// The result will be 0 because the arrays are different.
print_r($result);

0
因为它们是两个不同的对象,具有两个不同的引用,一个发生的事情不会影响另一个。就这么简单。

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