检查 PHP 中的真实数组标识?
Posted
技术标签:
【中文标题】检查 PHP 中的真实数组标识?【英文标题】:Check for true array identity in PHP? 【发布时间】:2012-12-23 14:00:00 【问题描述】:有没有办法检查表示数组或对象的两个变量的 identity(即完全相同的对象,在内存中只占一个位置)? (即,当修改由一个变量命名的对象时,可以在另一个变量的值中看到更改,因为它们指向同一个对象/数组)
例如,===
运算符检查两个数组是否“相同”,因为它们的元素和它们的顺序是相等的(而不是 ==
,它不检查数组的顺序,所以对于 @ 987654327@, $a == $b
是 true
但 $a === $b
是 false
(因为在后一种情况下排序不同,数组是有序映射)。
我想象中的 are_identical
函数会像这样工作(有点像 Python 中的 is
):
$a = [11, 22];
$b = [11, 22];
are_identical($a, $b); # => false
$x = [11, 22];
$y = &$x;
are_identical($x, $y); # => true
【问题讨论】:
也许这会对你有所帮助.. ***.com/questions/5153528/… @ArtemL 谢谢,我只是看看... 我想提一下,对于您的问题,通常有一个解决方案,不需要您知道两个变量是否指向同一个数组。特别是因为在 php 中很容易得到一个新数组。 重复/类似问题:***.com/questions/4817562/… 和 ***.com/questions/1541865/… 以及 ***.com/questions/3148125/… 【参考方案1】:好的,感谢 Artem L 和 SDC:是的,其他人也问过这个问题,但形式不同,所以我不知道该寻找什么。
这段代码似乎满足了我的are_identical
函数的目的(否定):
function is_reference_to(&$a, &$b)
if ($a !== $b) return false;
$temp = $a;
$checkval = $a === null ? "" : null;
$a = $checkval;
if ($b === $checkval)
$a = $temp;
return true;
else
$a = $temp;
return false;
【讨论】:
【参考方案2】:PHP 中的对象可以使用三等号来测试它们是否是同一个实例:
if($obj1 === $obj2) ....
但是,数组不是 PHP 中的对象,因此三等号技巧对它们的作用与对对象的作用不同。
也就是说,这个 php 手册页也可能会有所帮助:Spotting References。 cmets 中有几个函数声称能够检测相互引用的变量。
【讨论】:
【参考方案3】:你不能用 PHP 中的数组来做到这一点;但是,您可以将代码更改为使用 ArrayObject
并使用 ===
运算符进行比较。
在 PHP 中,===
运算符仅在对象是同一类的同一实例时才返回 true(即它们引用内存中的同一对象)。
【讨论】:
以上是关于检查 PHP 中的真实数组标识?的主要内容,如果未能解决你的问题,请参考以下文章