Tableau PHP et ArrayObject
Lequel doit être utilisé pour manipuler des données, un tableau ou un objet tableau? Comme la recherche, le tri et d'autres manipulations de tableau.
6 réponses
Le type de base est array
. Il s'agit d'une carte des clés et des valeurs qui peuvent être écrites, lues et accessibles en boucle.
Le ArrayObject
est une classe que vous pouvez étendre à créer des objets qui se comportent comme s'ils étaient des tableaux. Il implémente des méthodes comme count
et sort
qui vous permettent de traiter un objet comme vous le feriez pour un tableau. Il fait partie de la SPL (bibliothèque PHP Standard).
Généralement, vous utiliseriez array
. Vous saurez quand vous avez besoin de ArrayObject
.
En termes de performance, vous ne remarquerez pas de différence réelle entre un array
et un ArayObject
.
Je fais 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 méthode et chaque nombre de lignes. La différence entre les méthodes est assez insignifiante (84 microsecondes lorsque vous traitez un million de lignes...)
J'ai couru ce test plusieurs fois, et parce que les différences sont toujours une question de microsecondes, parfois une méthode est plus efficace lors d'un test, puis moins efficace lors du test suivant...
Le choix dépendra de vos besoins:
- Si vous traitez avec des tableaux simples, et faites une boucle comme
foreach()
ou calculez une moyenne, unarray
suffit amplement, - Si vous avez besoin d'itérations plus complexes, de tri, de filtrage,... il est plus facile de développer le
ArrayObject class
, avec votre propre itérateur, méthode...
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 une opération simple et habituelle, array est plus prefferable que arrayObject.
Vous utilisez array
pour les tableaux simples (et standard)
ArrayObject
est une classe, qui peut être utilisée pour améliorer vos propres Classes à utiliser comme tableaux (disons une classe de Collection de la vôtre)
La Plupart du temps un tableau est tout ce qui est nécessaire. ArrayObject est le plus utile lorsqu'il est étendu pour des fonctionnalités dans des utilisations particulières.
L'objet tableau peut être étendu et les fonctions masquées. Par exemple, votre fonction append () peut formater un nombre à deux décimales avant d'appeler parent::append ()