在PHP中检查真正的数组标识?

时间:2013-01-09 13:46:12

标签: php arrays identity

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

例如,===运算符检查两个数组是否“相同”,因为它们的元素及其排序相等(而不是==,而不检查数组的排序,对于$a = [11, 22]; $b = [1 => 22; 0 => 11];$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

3 个答案:

答案 0 :(得分:3)

你不能用PHP中的数组做到这一点;但是,您可以更改代码以使用ArrayObject并使用===运算符进行比较。

在PHP中,如果对象是同一个类的相同实例(即它们引用内存中的同一个对象),===运算符将仅返回true。

答案 1 :(得分:1)

可以通过使用三等号来测试PHP中的对象以查看它们是否是同一个实例:

if($obj1 === $obj2) {....}

但是,数组不是PHP中的对象,因此三重相等的技巧不会像对象那样对它们起作用。

也就是说,这个php手册页也可以提供帮助:Spotting References。评论中有几个功能声称能够检测到彼此引用的变量。

答案 2 :(得分:0)

好的,感谢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;
    }        
}