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.

28
demandé sur hakre 2009-09-09 19:28:06

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.

29
répondu drewm 2012-05-06 14:06:00

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, un array 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...
8
répondu Bertrand Fourrier 2014-11-25 14:13:55

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.

2
répondu Sadat 2009-09-09 17:31:06

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)

1
répondu knittl 2009-09-09 16:08:27

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.

0
répondu GZipp 2009-09-09 15:33:16

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 ()

0
répondu Anthony Scaife 2013-08-30 01:32:52