2011-01-10 8 views

答えて

38

docsから:

配列やオブジェクトをキーとして使用することはできません。そうすると警告が表示されます:不正なオフセットタイプ。

__toString()のように、各インスタンスに一意のIDを指定したり、オーバーライドしたりすることができます。

$array[(string) $instance] = 42; 
+5

+1のキーとしてオブジェクトを使用することが可能になります。 – Fractaly

+0

...彼の得点を42にして、そのままにしておきましょう^ _^ – vaxquis

2

のみintegers and strings are allowed as array keys。あなたは、その機能が絶対に必要な場合は、ArrayAccessを実装するクラスを書くことができます。

+1

オブジェクトを配列キーとして使用することはできません。それが許すのは、オブジェクトを配列として扱うことだけです。オブジェクトのプロパティはキーになります。 –

+1

オブジェクトをキーとして使用できるようになります。実装例については、http://pastebin.com/fzqeFswJを参照してください。 – Oswald

+0

私はあなたが何を意味するかを見て、それは理にかなっています。つまり、オブジェクトを_array_キーとして使用することはできません。しかし、そうですね、ArrayAccessオブジェクト –

13

あなたはそれが本当の配列ではありませんが、配列のような機能や構文のまともな量を持っている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); 

によって実際の配列に変換すると便利な場合がありますので、コードベースの残りの部分でうまくいきます。

14

spl_object_hash配列キーとして使用できる一意のオブジェクトIDを文字列として取得する機能があります。 http://php.net/manual/en/function.spl-object-hash.php

+1

実際にはドキュメントから:オブジェクトが破壊されたとき、そのオブジェクトの**ハッシュは他のオブジェクトのために再利用することができます**。 一般的には、ヤギの示唆どおりにSplObjectStorageを使用することをお勧めします。 – mancze

0

オブジェクトがnew stdClass()で作成された単純な事前定義されたクラスである場合、json_encodeでこのクラスのjson表現を使用する有効なオプションがあります。

しかし、2つのオブジェクトの等価性は常にビジネスモデルの選択肢であり、慎重に設計する必要があります。

関連する問題