Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 与严格比较不匹配的数组_Php_Arrays - Fatal编程技术网

Php 与严格比较不匹配的数组

Php 与严格比较不匹配的数组,php,arrays,Php,Arrays,$c1==$v1为false。但是为什么呢?似乎$v1会自动设置为不同的数组,然后自动设置为原始数组。为什么会这样 最初,$c和$v1被设置为相同的数组实例。因此,如果我对$v1进行变异,$c不应反映更改,因为它们被设置为相同的数组实例。这些将不相同,因为您显式地将它们设置为包含不同的值。第一个为空,而第二个保存值 但是,它们并没有设置为相同的引用,所以它们是两个不同的变量——当您设置时 $c1 = $v1 = array(); $v1['key'] = 'value'; echo '$c1 =

$c1==$v1
为false。但是为什么呢?似乎
$v1
会自动设置为不同的数组,然后自动设置为原始数组。为什么会这样


最初,
$c
$v1
被设置为相同的数组实例。因此,如果我对$v1进行变异,
$c
不应反映更改,因为它们被设置为相同的数组实例。

这些将不相同,因为您显式地将它们设置为包含不同的值。第一个为空,而第二个保存值

但是,它们并没有设置为相同的引用,所以它们是两个不同的变量——当您设置时

$c1 = $v1 = array();
$v1['key'] = 'value';
echo '$c1 === $v1: ' . (($c1 === $v1) ? 'true' : 'false'); // prints false
您可以创建两个不同的数组。如果希望在两个数组中都反映其中一个的更改,则需要使用变量标识符前面的
&
运算符将其作为引用,如下所示

$c1 = $v1 = array();
请注意,您需要在创建希望引用的变量之后引用它

当使用这样的引用时,它是双向的-对
$v1
的任何更改都将应用于
$c1
,反之亦然。因此,它们是不同的变量,但始终保持相同的值

上面例子中的比较是正确的,因为数组是完全相同的——不仅仅是通过引用,还因为它们拥有相同的值和键。如果比较两个具有完全相同的值和完全相同的匹配键的非引用数组,也会得到一个真正的等式

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


因为它们是两个不同的对象,有两个不同的引用,其中一个不会影响另一个。就这么简单。

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

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

为什么它应该相等<代码>[]==['key'=>'value']
您分配了
$v1
一个值,另一个值为空。所以数组不匹配。你到底想实现什么?检查两者是否都是阵列?检查它们是否是相等的数组(它们不是)。您混淆了按值赋值和按引用赋值。在您的作业中
$c1
!=<代码>第1行后面的$v1。请看@sohan我冒昧地更改了你问题的标题。“Bizzare PHP问题”不是很有帮助,也不是很有描述性——请随意将其更改为更合适的内容!
<?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);