PHP Array and ArrayObject
The basic type is array
. This is a map of keys and values that can be written to, read from and accessed in a loop.
The ArrayObject
is a class that you can extend to create objects that behave as if they were arrays. It implements methods like count
and sort
that enable you to treat an object like you would treat an array. It's part of the SPL (Standard PHP Library).
Typically you'd use array
. You'll know when you need ArrayObject
.
In term of performance, you won't notice a real difference between an array
and a ArayObject
.I run a simple test. The idea was to create arrays using array() and new ArrayObject, and fill them with an increasing number of values.
<?phpfor($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; } }}?>
Results
method lines average (µs) difference between methods (µs)array 1 2.470 -1.044array 10 8.452 +0.315array 100 71.862 +10.719array 1,000 773.826 +141.962array 10,000 7,868.731 -675.359array 100,000 76,954.625 -17,665.510array 1,000,000 801,509.550 -84,356.148ArrayObject 1 3.514 +1.044ArrayObject 10 8.137 -0.315ArrayObject 100 61.142 -10.719ArrayObject 1,000 631.864 -141.962ArrayObject 10,000 8,544.090 +675.359ArrayObject 100,000 94,620.135 +17,665.510ArrayObject 1,000,000 885,865.698 +84,356.148
The average is the average time of the 100 tests for each method and each number of lines.The difference between methods is quite insignificant (84 microseconds when you deal with a million rows...)
I've run this test many times, and because the differences are always a question of microseconds, sometimes a method is more efficient during one test, then less efficient during the next test...
The choice will depend of your needs:
- if you deal with simple arrays, and do a loop like
foreach()
or calculate an average, anarray
is quite enough, - if you need more complex iterations, sorting, filtering, ... it's easier to expand the
ArrayObject class
with your own iterator, methods...
arrayObject is mostly useful when serialization is needed.
Also you can create your own collection class by extending arrayObject. Then you can serialize your class object to transfer data.
for simple and usual operation array is more prefferable than arrayObject.