PHP-массив и ArrayObject

какой из них следует использовать для управления данными, массивом или объектом массива? Как поиск, сортировка и другие манипуляции с массивами.


person Imrul    schedule 09.09.2009    source источник
comment
У вас есть пример того, что вы хотите сделать?   -  person willoller    schedule 09.09.2009
comment
Мне нужно искать, сортировать и другие сложные манипуляции с использованием массива в основном для использования его в алгоритме. Поэтому мне нужно знать, какой из них лучше и быстрее.   -  person Imrul    schedule 09.09.2009


Ответы (6)


Основной тип — array. Это карта ключей и значений, которые можно записывать, читать и получать к ним доступ в цикле.

ArrayObject — это класс, который вы можете расширить для создания объектов, которые ведут себя так, как если бы они были массивами. Он реализует такие методы, как count и sort, которые позволяют обращаться с объектом так же, как с массивом. Это часть SPL (стандартной библиотеки PHP).

Обычно вы должны использовать array. Вы поймете, когда вам понадобится ArrayObject.

person drewm    schedule 09.09.2009

С точки зрения производительности вы не заметите реальной разницы между 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 с помощью собственного итератора, методов...
person Bertrand Fourrier    schedule 25.11.2014
comment
Пожалуйста, укажите версию php, это очень важно. - person Astery; 03.01.2015
comment
Мне кажется, что разница составляет 84 миллисекунды (84 365 микросекунд), когда вы имеете дело с миллионом строк... не то, чтобы в большинстве случаев разница была существенной. - person Erk; 24.06.2017

arrayObject в основном полезен, когда требуется сериализация.

Также вы можете создать свой собственный класс коллекции, расширив arrayObject. Затем вы можете сериализовать свой объект класса для передачи данных.

для простой и привычной работы массив предпочтительнее, чем arrayObject.

person Sadat    schedule 09.09.2009

вы используете array для простых (и стандартных) массивов

ArrayObject - это класс, который можно использовать для улучшения ваших собственных классов, которые будут использоваться в качестве массивов (скажем, какой-то ваш класс коллекции)

person knittl    schedule 09.09.2009
comment
ArrayObject не является абстрактным классом. - person GZipp; 09.09.2009

В большинстве случаев достаточно массива. ArrayObject наиболее полезен при расширении функциональности в конкретных целях.

person GZipp    schedule 09.09.2009

Объект массива может быть расширен, а функции переопределены. Например, ваша функция append() может форматировать число до двух знаков после запятой перед вызовом parent::append().

person Community    schedule 30.08.2013