2009-09-09 2 views
26

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

+0

У вас есть пример того, что вы хотите сделать? – willoller

+0

Мне нужно выполнить поиск, сортировку и другие сложные манипуляции с использованием массива в основном для его использования в алгоритме. Поэтому мне нужно знать, какой из них лучше и быстрее. – Imrul

ответ

27

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

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

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

0

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

1

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

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

+0

ArrayObject не является абстрактным классом. – GZipp

+0

О, ты прав. мой плохой, отредактированный – knittl

2

ArrayObject в основном полезен при необходимости сериализации.

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

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

0

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

8

В срок исполнения, вы не заметите реальную разницу между 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 с помощью собственного итератора, методов ...
+7

Пожалуйста, укажите версию php, это довольно важно. – Astery

+1

Мне кажется, что разница составляет 84 * миллисекунды * (84 365 * микросекунды *), когда вы имеете дело с миллионом строк ... не то, что разница в большинстве случаев значительна. – Erk

Смежные вопросы