質問
データ、配列、または配列オブジェクトの操作に使用すべきものはどれですか? 検索、ソート、その他の配列操作と同様。
解決
基本タイプは 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クラス
を拡張するのが簡単です...
arrayObjectは、シリアル化が必要な場合に最も役立ちます。
また、arrayObjectを拡張することにより、独自のコレクションクラスを作成できます。その後、クラスオブジェクトをシリアル化してデータを転送できます。
単純で通常の操作配列の場合、arrayObjectよりも優先されます。
単純な(および標準の)配列には array
を使用します
ArrayObject
はクラスです。これを使用して、独自のクラスを拡張して配列として使用できます(たとえば、自分のコレクションクラスなど)
ほとんどの場合、必要なのは配列だけです。 ArrayObjectは、特定の用途の機能向けに拡張された場合に最も役立ちます。
Arrayオブジェクトを拡張し、機能をオーバーライドできます。 たとえば、append()関数は、parent :: append()を呼び出す前に数値を小数点以下2桁にフォーマットできます