2

配列またはオブジェクトを表す2つの変数のID(つまり、まったく同じオブジェクトであり、メモリ内の1つの場所のみを占める)をチェックする方法はありますか?(つまり、1つの変数で指定されたオブジェクトを変更すると、同じオブジェクト/配列を指しているため、他の変数の値に変更が表示されます)

===たとえば、演算子は、要素と順序が等しいという意味で2つの配列が「同一」であるかどうかをチェックします(これとは対照的に、配列の順序はチェックされ==ないため$a = [11, 22]; $b = [1 => 22; 0 => 11];$a == $bはですtrueが、後者の場合$a === $bはそうです)false順序は異なり、配列は順序付けられたマップです)。

私の想像したare_identical関数は次のように機能します(isPythonの場合のように):

$a = [11, 22];
$b = [11, 22];
are_identical($a, $b); # => false

$x = [11, 22];
$y = &$x;
are_identical($x, $y); # => true
4

3 に答える 3

3

PHPの配列ではこれを行うことはできません。ただし、使用するコードを変更し、演算子ArrayObjectを使用して比較を行うことができます。===

PHPでは、===オブジェクトが同じクラスの同じインスタンスである(つまり、メモリ内の同じオブジェクトを参照している)場合にのみ、演算子はtrueを返します。

于 2013-01-09T13:48:55.460 に答える
1

PHPのオブジェクトは、triple-equalを使用して、同じインスタンスであるかどうかを確認するためにテストできます。

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

ただし、配列はPHPのオブジェクトではないため、トリプルイコールトリックはオブジェクトの場合とは異なり、機能しません。

そうは言っても、このphpマニュアルページも役立つかもしれません:スポッティングリファレンス。コメントには、相互に参照している変数を検出できると主張する関数がいくつかあります。

于 2013-01-09T14:03:55.520 に答える
0

OK、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;
    }        
}
于 2013-01-10T16:14:37.153 に答える