Массив PHP и ArrayObject
какой из них следует использовать для управления данными, массивом или объектом массива? Как поиск, сортировка и другие манипуляции массива.
6 ответов
базовый тип array
. Это карта ключей и значений, которые могут быть записаны, прочитаны и доступны в цикле.
на ArrayObject
- это класс, который можно расширить для создания объектов, которые ведут себя как массивы. Он реализует такие методы, как count
и sort
, которые позволяют рассматривать объект как с массивом. Это часть SPL (стандартная библиотека PHP).
обычно вы используете array
. Вы будете знать, когда вам нужно ArrayObject
.
С точки зрения производительности вы не заметите реальной разницы между array
и ArayObject
.
Я провожу простой тест. Идея заключалась в создании массивов с использованием array() и new 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 тестов для каждого метода и каждого количества строк. Разница между методами довольно незначительна (84 микросекунды, когда вы имеете дело с миллионом строки...)
я запускал этот тест много раз, и поскольку различия всегда вопрос микросекунд, иногда метод является более эффективным во время одного теста, а затем менее эффективным во время следующего теста...
выбор будет зависеть от ваших потребностей:
- если вы имеете дело с простыми массивами, и делаем петлю, как
foreach()
или вычислить среднемarray
вполне достаточно, - если вам нужны более сложные итерации, сортировка, фильтрация,... легче расширить
ArrayObject class
С вашим собственным итератором, методы...
arrayObject в основном полезен при необходимости сериализации.
также вы можете создать свой собственный класс коллекции, расширяя arrayObject. Затем вы можете сериализовать объект class для передачи данных.
для простого и обычного массива операций более предпочтителен, чем arrayObject.
вы используете array
для простых (и стандартных) массивов
ArrayObject
- это класс, который можно использовать для улучшения ваших собственных классов, которые будут использоваться как массивы (скажем, какой-то ваш класс коллекции)
большую часть времени массив-это все, что нужно. ArrayObject наиболее полезен, когда расширен для функциональности, в частности, использует.
объект массива может быть расширен и функции переопределены. Например, функция append () может форматировать число до двух знаков после запятой перед вызовом parent::append ()