データ、配列、または配列オブジェクトの操作に使用する必要があるのはどれですか?検索、並べ替え、その他の配列操作と同様です。
基本的なタイプはarray
です。これは、ループで書き込み、読み取り、アクセスできるキーと値のマップです。
ArrayObject
は、配列であるかのように動作するオブジェクトを作成するために拡張できるクラスです。 count
やsort
のようなメソッドを実装し、配列を扱うのと同じようにオブジェクトを扱うことができます。これはSPLの一部です(標準PHPライブラリ)。
通常はarray
を使用します。 ArrayObject
がいつ必要になるかがわかります。
パフォーマンスに関しては、array
とArayObject
の実際の違いに気付くことはありません。簡単なテストを実行します。アイデアは、array()と新しいArrayObjectを使用して配列を作成し、それらに値の数を増やして埋めることでした。
_<?php
for($i = 0; $i < 2; $i++){
$method = $i == 0 ? 'array' : 'ArrayObject';
for($j = 0; $j < 7 ; $j++){
for($k = 0; $k < 100; $k++){
$max = pow(10,$j);
$array = $method == 'array' ? array() : new ArrayObject;
$time = explode(' ',microtime());
$sTime = $time[0] + $time[1];
for($l = 0; $l < $max; $l++){
$array[] = 'foo ' . $i . ':' . $j . ':' . $k . ':' . $l;
}
$time = explode(' ',microtime());
$eTime = $time[0] + $time[1];
$results[$method][$max][] = $eTime - $sTime;
}
}
}
?>
_
結果
_method lines average (µs) difference between methods (µs)
array 1 2.470 -1.044
array 10 8.452 +0.315
array 100 71.862 +10.719
array 1,000 773.826 +141.962
array 10,000 7,868.731 -675.359
array 100,000 76,954.625 -17,665.510
array 1,000,000 801,509.550 -84,356.148
ArrayObject 1 3.514 +1.044
ArrayObject 10 8.137 -0.315
ArrayObject 100 61.142 -10.719
ArrayObject 1,000 631.864 -141.962
ArrayObject 10,000 8,544.090 +675.359
ArrayObject 100,000 94,620.135 +17,665.510
ArrayObject 1,000,000 885,865.698 +84,356.148
_
平均は、各メソッドおよび各行数の100回のテストの平均時間です。メソッド間の違いは非常に重要ではありません(100万行を処理する場合は84マイクロ秒...)
私はこのテストを何度も実行しましたが、違いは常にマイクロ秒の問題であるため、あるテストではメソッドの効率が高くなり、次のテストでは効率が低下することがあります...
選択はあなたのニーズに依存します:
foreach()
のようなループを実行するか、平均を計算する場合、array
で十分です。ArrayObject class
_を拡張する方が簡単です...arrayObjectは、シリアル化が必要な場合に最も役立ちます。
また、arrayObjectを拡張して、独自のコレクションクラスを作成することもできます。次に、クラスオブジェクトをシリアル化してデータを転送できます。
単純で通常の操作の場合、arrayはarrayObjectよりも好ましいです。
単純な(および標準の)配列にはarray
を使用します
ArrayObject
はクラスであり、配列として使用される独自のクラスを拡張するために使用できます(たとえば、独自のコレクションクラス)。
ほとんどの場合、必要なのは配列だけです。 ArrayObjectは、特定の用途の機能のために拡張された場合に最も役立ちます。
配列オブジェクトを拡張して、関数を上書きすることができます。たとえば、append()関数は、parent :: append()を呼び出す前に、数値を小数点以下2桁にフォーマットできます。