2009-09-09 19 views
26

quale si dovrebbe usare per manipolare dati, matrice o oggetto matrice? Come le manipolazioni di ricerca, ordinamento e altri array.Array PHP e ArrayObject

+0

Hai un esempio di cosa vuoi fare? – willoller

+0

Ho bisogno di cercare, ordinare e altre complicate manipolazioni usando Array fondamentalmente per usarlo nell'algoritmo. Quindi ho bisogno di sapere qual è il migliore e più veloce. – Imrul

risposta

27

Il tipo di base è array. Questa è una mappa di chiavi e valori che è possibile scrivere, leggere e accedere in un loop.

ArrayObject è una classe che è possibile estendere per creare oggetti che si comportano come se fossero array. Implementa metodi come count e sort che consentono di trattare un oggetto come se si trattasse di un array. Fa parte della SPL (Standard PHP Library).

In genere si utilizza array. Saprai quando avrai bisogno di ArrayObject.

0

La maggior parte delle volte una matrice è tutto ciò che è necessario. ArrayObject è molto utile se esteso per funzionalità in particolari usi.

1

si utilizza array per semplici (e standard) array

ArrayObject è una classe, che può essere utilizzato per migliorare le proprie classi da utilizzare come array (ad esempio alcune Class Collection di tuo)

+0

ArrayObject non è una classe astratta. – GZipp

+0

oh hai ragione. my bad, edited – knittl

2

arrayObject è utile soprattutto quando è necessaria la serializzazione.

Inoltre è possibile creare la propria classe di raccolta estendendo arrayObject. Quindi puoi serializzare il tuo oggetto di classe per trasferire i dati.

per l'array di operazioni semplice e normale è più preferibile di arrayObject.

0

L'oggetto array può essere esteso e le funzioni sono sovrascritte. Per esempio, la funzione il vostro append() potrebbe formattare un numero a due cifre decimali prima di chiamare parent :: append()

8

In termini di prestazioni, non si noterà la differenza tra un array e ArayObject. Ho eseguito un semplice test. L'idea era di creare array usando array() e nuovo ArrayObject, e riempirli con un numero crescente di valori.

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

Risultati

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 

La media è il tempo medio di 100 test per ciascun metodo e ciascun numero di righe. La differenza tra i metodi è abbastanza insignificante (84 microsecondi quando si gestisce un milione di righe ...)

Ho eseguito questo test molte volte, e poiché le differenze sono sempre una questione di microsecondi, a volte un metodo è più efficiente durante un test, quindi meno efficiente durante il prossimo test ...

la scelta dipenderà delle vostre esigenze:

  • se avete a che fare con gli array semplici, e fare un ciclo come foreach() o calcolare un medio, uno array è abbastanza,
  • se hai bisogno di iterazioni più complesse, ordinamento, filtraggio, ... è più facile espandere il ArrayObject class con il tuo iteratore, i metodi ...
+7

Per favore, specifica la versione di php, è abbastanza significativo. – Astery

+1

Mi sembra che la differenza sia di 84 * millisecondi * (84 365 * microsecondi *) quando gestisci un milione di righe ... non che la differenza sia significativa nella maggior parte dei casi. – Erk