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