2009-09-09 14 views
26

lequel devrait être utilisé pour manipuler des données, un tableau ou un objet tableau? Comme la recherche, le tri et d'autres manipulations de tableaux.PHP Array et ArrayObject

+0

Avez-vous un exemple de ce que vous voulez faire? – willoller

+0

J'ai besoin de rechercher, trier et d'autres manipulations complexes en utilisant Array essentiellement pour l'utiliser dans l'algorithme. J'ai donc besoin de savoir lequel est le meilleur et le plus rapide. – Imrul

Répondre

27

Le type de base est array. Ceci est une carte des clés et des valeurs qui peuvent être écrites, lues et consultées dans une boucle.

Le ArrayObject est une classe que vous pouvez étendre pour créer des objets qui se comportent comme s'ils étaient des tableaux. Il implémente des méthodes telles que count et sort qui vous permettent de traiter un objet comme si vous traitez un tableau. Cela fait partie du SPL (Standard PHP Library).

Généralement, vous utiliseriez array. Vous saurez quand vous avez besoin de ArrayObject.

0

La plupart du temps, un tableau est tout ce dont vous avez besoin. ArrayObject est plus utile lorsqu'il est étendu pour la fonctionnalité dans des utilisations particulières.

1

vous utilisez array pour de simples (standard) tableaux

ArrayObject est une classe, qui peut être utilisé pour améliorer vos propres classes à utiliser sous forme de tableaux (par exemple une classe Collection de la vôtre)

+0

ArrayObject n'est pas une classe abstraite. – GZipp

+0

oh vous avez raison. mon mauvais, édité – knittl

2

de ArrayObject est surtout utile lorsque la sérialisation est nécessaire.

Vous pouvez également créer votre propre classe de collection en étendant arrayObject. Ensuite, vous pouvez sérialiser votre objet de classe pour transférer des données.

pour un tableau d'opérations simple et habituel est plus préférablement que arrayObject.

0

Array L'objet peut être étendu et les fonctions peuvent être surchargées. Par exemple, votre fonction append() pourrait mettre en forme un nombre à deux décimales avant d'appeler parent :: append()

8

En terme de performance, vous ne remarquerez pas une réelle différence entre un array et un ArayObject. Je cours un test simple. L'idée était de créer des tableaux en utilisant array() et new ArrayObject, et de les remplir avec un nombre croissant de valeurs.

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

Résultats

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 moyenne est la durée moyenne des 100 tests pour chaque procédé et chaque nombre de lignes. La différence entre les méthodes est tout à fait insignifiante (84 microsecondes quand vous faites face à un million de lignes ...)

J'ai exécuté ce test plusieurs fois, et parce que les différences sont toujours une question de microsecondes, parfois une méthode est plus efficace au cours d'un test, moins efficace lors du test suivant ...

le choix dépendra de vos besoins:

  • si vous traitez avec des tableaux simples, et faire une boucle comme foreach() ou calculer un moyenne, un array est assez,
  • Si vous avez besoin d'itérations plus complexes, de tri, de filtrage, ... il est plus facile d'étendre le ArrayObject class avec votre propre itérateur, méthodes ...
+7

S'il vous plaît, spécifiez la version de php, c'est assez important. – Astery

+1

On dirait que la différence est de 84 * millisecondes * (84 365 * microsecondes *) quand on traite avec un million de lignes ... pas que la différence soit significative dans la plupart des cas. – Erk