检查 PHP 中的真实数组标识?

Posted

技术标签:

【中文标题】检查 PHP 中的真实数组标识?【英文标题】:Check for true array identity in PHP? 【发布时间】:2012-12-23 14:00:00 【问题描述】:

有没有办法检查表示数组或对象的两个变量的 identity(即完全相同的对象,在内存中只占一个位置)? (即,当修改由一个变量命名的对象时,可以在另一个变量的值中看到更改,因为它们指向同一个对象/数组)

例如,=== 运算符检查两个数组是否“相同”,因为它们的元素和它们的顺序是相等的(而不是 ==,它不检查数组的顺序,所以对于 @ 987654327@, $a == $btrue$a === $bfalse(因为在后一种情况下排序不同,数组是有序映射)。

我想象中的 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 中的真实数组标识?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:检查 url 是真实文件还是符号链接

第16章_数组:

SMTP判断邮箱是否存在 检查email地址是否真实存在

PHP中的真实通知/推送通知系统

PHP - 如何处理应该存在于应用程序命名空间中的真实测试双打?

如何计算 NumPy bool 数组中真实元素的数量