2009-09-09 11 views
26

Którego należy użyć do manipulowania obiektem danych, macierzy lub macierzy? Podobnie jak w przypadku wyszukiwania, sortowania i innych operacji na tablicach.PHP Array i ArrayObject

+0

Czy masz przykład tego, co chcesz zrobić? – willoller

+0

Potrzebuję wyszukiwania, sortowania i innych skomplikowanych manipulacji za pomocą Array w zasadzie do korzystania z niego w algorytmie. Muszę więc wiedzieć, który z nich jest lepszy i szybszy. – Imrul

Odpowiedz

27

Podstawowy typ to array. Jest to mapa kluczy i wartości, które można zapisać, odczytać i uzyskać do nich dostęp w pętli.

The ArrayObject to klasa, którą można rozszerzyć, aby tworzyć obiekty, które zachowują się tak, jakby były tablicami. Implementuje takie metody, jak count i sort, które umożliwiają traktowanie obiektu takiego, jak gdyby traktowałbyś tablicę. Jest częścią SPL (Standardowej Biblioteki PHP).

Zazwyczaj używa się array. Dowiesz się, kiedy potrzebujesz ArrayObject.

0

W większości przypadków tablica jest wszystkim, czego potrzeba. ArrayObject jest najbardziej przydatny, gdy zostanie rozszerzony o funkcje w konkretnych zastosowaniach.

1

użyć array do prostych (i standardowych) tablic

ArrayObject to klasa, która może być stosowana w celu zwiększenia własnych klas do wykorzystania jako tablice (słownie niektóre Collection Klasa Twoim)

+0

ArrayObject nie jest klasą abstrakcyjną. – GZipp

+0

o masz rację. moja zła, edytowana – knittl

2

arrayObject jest najbardziej przydatna, gdy potrzebna jest serializacja.

Można również utworzyć własną klasę kolekcji poprzez rozszerzenie arrayObject. Następnie możesz serializować obiekt klasy, aby przesłać dane.

dla prostej i zwykłej tablicy operacyjnej jest bardziej korzystny niż arrayObject.

0

Obiekt Array może być rozszerzony, a funkcje są niedostępne. Na przykład, funkcja Twój append() może sformatować liczbę do dwóch miejsc po przecinku przed wywołaniem parent :: append()

8

W perspektywie wydajności, nie będzie zauważyć różnicę pomiędzy array i ArayObject. Prowadzę prosty test. Chodziło o to, aby utworzyć tablice za pomocą array() i nowego ArrayObject, i wypełnić je rosnącą liczbą wartości.

<?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; 
     } 
    } 
} 
?> 

Wyniki

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 

Średnia wynosi średni czas 100 testów dla każdej metody i każdej liczby linii. Różnica między metodami jest dość nieznaczna (84 mikrosekundy, gdy mamy do czynienia z milionem wierszy ...)

Przeprowadziłem ten test wiele razy, a ponieważ różnice są zawsze kwestią mikrosekund, czasami metoda jest bardziej wydajny podczas jednego testu, a następnie mniej wydajny podczas następnego testu ...

wybór będzie zależał od potrzeb:

  • jeśli masz do czynienia z prostych tablic i zrobić pętlę jak foreach() lub obliczenia średnia, array wystarczy,
  • jeśli potrzebujesz bardziej złożonych iteracji, sortowania, filtrowania, ... łatwiej jest rozwinąć ArrayObject class z własnym iteratorem, metodami ...
+7

Proszę podać wersję php, jest dość znacząca. – Astery

+1

Wygląda na to, że różnica wynosi 84 * milisekund * (84 365 * mikrosekund *), gdy masz do czynienia z milionem wierszy ... w większości przypadków różnica nie jest znacząca. – Erk