web-dev-qa-db-ja.com

連想配列とSplObjectStorage

私は、一意のオブジェクトのコレクションを管理するためのコードに取り組んでいます。このコードの最初のプロトタイプは、基本的に私がいつもやってきた方法であるため、連想配列を利用しています。

ただし、SplObjectStorageなどの最新バージョンのPHP)に追加された機能を利用して、代わりにこれを行うことにも熱心です。これは、一部は学習体験として、一部は提供する必要があるためです。利点(私が見たベンチマークは、多くの場合、SplObjectStorageが配列よりも高速である可能性があることを示唆しています)。

現在の実装には連想配列があり、新しいオブジェクトを追加する前に、in_arrayでオブジェクトがすでに配列にあるかどうかを確認します。

SplObjectStorageで私が見ることができる大きな問題は、(一見)キー/値連想配列の動作をサポートしていないように見え、インデックス付き配列としてのみ扱うことができるということです。ただし、PHPの新しい機能のドキュメントは、言語のより確立された部分のドキュメントの標準に達しておらず、単に何かが足りない可能性があります。

連想配列の代わりにSplObjectStorageを使用できますか?その場合、新しいオブジェクトを追加するときにキーを定義するにはどうすればよいですか?さらに重要なことに、連想配列と比較した場合のSplObjectStorageの相対的な長所と短所は何ですか?

29
GordonM

SplObjectStorageをキー値ストアとして表示するのではなく、単にオブジェクトのセットとして表示する必要があります。セットに何かが含まれているかどうかはわかりませんが、その位置は重要ではありません

SplObjectStorage内の要素の「キー」は、実際にはオブジェクトのハッシュです。同じオブジェクトインスタンスの複数のコピーをSplObjectStorageに追加することはできないため、追加する前にコピーがすでに存在するかどうかを確認する必要はありません。

ただし、_PHP 5.4_には、オブジェクトの「ハッシュ」を返すgetHash()という新しいメソッドをオーバーライドできます。これは、ある意味で、キーを返す/設定するので、さまざまな条件下でキーを保存できます。

SplObjectStorageの主な利点は、さまざまなセットを処理および操作するための多くのメソッドを取得できることです(contains()removeAll()removeAllExcept() etc)。その速度はわずかに優れていますが、メモリ使用量が悪い通常のPHP配列よりも悪いです。

26
JayTaph

実行後の結果 benchmarkPHP 5.6.13で10000回の反復:

+------------------+----------------+----------------+---------+
|       Type       |  Time to fill  | Time to check  | Memory  |
+------------------+----------------+----------------+---------+
| SplObjectStorage | 0.021285057068 | 0.019490000000 | 2131984 |
| Array            | 0.021125078201 | 0.020912000000 | 1411440 |
+------------------+----------------+----------------+---------+

ご覧のとおり、ArraySplObjectStorageよりもそれほど速くはありませんが、34%少ないメモリ

4
Roman Liukshyn

アレイに割り当てられたすべてのメモリが使い果たされると、アレイに割り当てられたメモリは2倍になります。このコンテキストでは、オブジェクトのコレクションがより効果的な構造になる場合があります。

0
John Smith