PHP Array et ArrayObject
-
05-07-2019 - |
Question
lequel faut-il utiliser pour manipuler des données, un tableau ou un objet tableau? Comme la recherche, le tri et d’autres manipulations de tableaux.
La solution
Le type de base est array
. Ceci est une carte de clés et de valeurs sur lesquelles on peut écrire, lire et accéder en boucle.
ArrayObject
est une classe que vous pouvez étendre pour créer des objets qui se comportent comme s'il s'agissait de tableaux. Il implémente des méthodes telles que count
et sort
, qui vous permettent de traiter un objet comme un tableau. Cela fait partie de la SPL (Standard PHP Library).
Typiquement, vous utiliseriez array
. Vous saurez quand vous aurez besoin de ArrayObject
.
Autres conseils
En termes de performances, vous ne remarquerez pas de réelle différence entre un tableau
et un ArayObject
.
Je lance un test simple. L'idée était de créer des tableaux à l'aide de array () et du nouvel 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 minime (84 microsecondes lorsque vous traitez un million de lignes ...)
J'ai exécuté ce test plusieurs fois, et comme les différences sont toujours une question de microsecondes, une méthode est parfois plus efficace lors d'un test, puis moins lors du test suivant ...
Le choix dépendra de vos besoins:
- si vous utilisez des tableaux simples et faites une boucle comme
foreach ()
ou calculez une moyenne, untableau
suffit, - si vous avez besoin d'itérations plus complexes, d'un tri, d'un filtrage, ... il est plus facile de développer la
classe ArrayObject
avec votre propre itérateur, méthodes ...
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 les opérations simples et habituelles, array est plus pratique que arrayObject.
vous utilisez array
pour des tableaux simples (et standard)
ArrayObject
est une classe qui peut être utilisée pour améliorer vos propres classes et les utiliser comme tableaux (par exemple, une classe de collection)
La plupart du temps, un tableau suffit. ArrayObject est particulièrement utile lorsqu'il est étendu à des fonctionnalités particulières.
L'objet Array peut être étendu et les fonctions masquées. Par exemple, votre fonction append () peut formater un nombre avec deux décimales avant d'appeler parent :: append ()