:インスタンス化されたオブジェクトを配列キーとして使用できますか?たとえば、
$product = new Product("cat");
if(isset($sales[$product])){
$sales[$product]++;
}
else{
$sales[$product] = 1;
}
:インスタンス化されたオブジェクトを配列キーとして使用できますか?たとえば、
$product = new Product("cat");
if(isset($sales[$product])){
$sales[$product]++;
}
else{
$sales[$product] = 1;
}
docsから:
配列やオブジェクトをキーとして使用することはできません。そうすると警告が表示されます:不正なオフセットタイプ。
__toString()
のように、各インスタンスに一意のIDを指定したり、オーバーライドしたりすることができます。
$array[(string) $instance] = 42;
のみintegers and strings are allowed as array keys。あなたは、その機能が絶対に必要な場合は、ArrayAccessを実装するクラスを書くことができます。
オブジェクトを配列キーとして使用することはできません。それが許すのは、オブジェクトを配列として扱うことだけです。オブジェクトのプロパティはキーになります。 –
オブジェクトをキーとして使用できるようになります。実装例については、http://pastebin.com/fzqeFswJを参照してください。 – Oswald
私はあなたが何を意味するかを見て、それは理にかなっています。つまり、オブジェクトを_array_キーとして使用することはできません。しかし、そうですね、ArrayAccessオブジェクト –
あなたはそれが本当の配列ではありませんが、配列のような機能や構文のまともな量を持っているhttp://www.php.net/manual/en/class.splobjectstorage.php
$product = new Product("cat");
$sales = new SplObjectStorage();
if(isset($sales[$product])){
$sales[$product]++;
}
else{
$sales[$product] = 1;
}
を使用することができます。しかし、それはオブジェクトであるため、奇妙なforeachの振る舞いと、すべてのネイティブPHP配列関数との非互換性のために、PHPのミスフィットのように振る舞います。場合によっては、
$arr = iterator_to_array($sales);
によって実際の配列に変換すると便利な場合がありますので、コードベースの残りの部分でうまくいきます。
spl_object_hash配列キーとして使用できる一意のオブジェクトIDを文字列として取得する機能があります。 http://php.net/manual/en/function.spl-object-hash.php
実際にはドキュメントから:オブジェクトが破壊されたとき、そのオブジェクトの**ハッシュは他のオブジェクトのために再利用することができます**。 一般的には、ヤギの示唆どおりにSplObjectStorageを使用することをお勧めします。 – mancze
オブジェクトがnew stdClass()
で作成された単純な事前定義されたクラスである場合、json_encode
でこのクラスのjson表現を使用する有効なオプションがあります。
しかし、2つのオブジェクトの等価性は常にビジネスモデルの選択肢であり、慎重に設計する必要があります。
+1のキーとしてオブジェクトを使用することが可能になります。 – Fractaly
...彼の得点を42にして、そのままにしておきましょう^ _^ – vaxquis