2008-10-29 34 views
23

¿Alguien puede explicar cómo PHP implementa arrays asociativos? ¿Qué estructura de datos subyacente usa PHP? PHP hash la clave y la almacena en algún tipo de hash map? Tengo curiosidad porque me preguntaba cuál era el rendimiento de las matrices asociativas al insertar y buscar claves.¿Cómo se implementan las matrices asociativas en PHP?

+0

Voy a dejar este enlace para otra persona a través de moler, pero se puede ver el código fuente C real para PHP en [http://svn.php.net/viewvc/php/php-src /](http://svn.php.net/viewvc/php/php-src/) –

Respuesta

6

Bueno, por lo que vale, todos Los arreglos PHP son matrices asociativas.

3

@EBGreen es correcto.

Lo que le ofrece algunos problemas de rendimiento interesantes, especialmente cuando trata una matriz como una lista y utiliza el operador [] (array add). PHP no parece almacenar en caché la clave numérica más grande y agregarle una, sino que parece recorrer todas las teclas para encontrar cuál debería ser la siguiente clave numérica. He reescrito scripts en Python debido a la pésima performance de array como una lista de PHP.

Las matrices asociativas tienen la sobrecarga de rendimiento estándar de dict/hash.

+3

¿Estás seguro de esto? Acabo de ejecutar benchmarks en una matriz de prueba de 1000 entradas (copiando a una nueva matriz, una por una), y si no especificas la clave para la nueva matriz, es consistentemente 7% más rápida (en PHP 5.2.6) – JamShady

+0

Es posible que lo hayan cambiado recientemente. Estaba usando 5.1 cuando estaba haciendo el trabajo. El conjunto de PHP era INCORRECTO cuando habla de entradas de 10k o más. – jcoby

+2

AFAIK este no es el caso, por favor compare: [Una tabla zend hash tiene un elemento 'nNextFreeElement' ...] (http://stackoverflow.com/questions/3698743/how-to-find-the-next-numeric -index-of-a-existing-array/3698786 # 3698786) – hakre

4

la más alta respuesta votado enlace está roto y no da esa mucha explicación.

PHP está escrito en C y la estructura subyacente es solo una matriz en C. C arrays son solo fragmentos de memoria. Los índices en las matrices C deben ser continuos, no puede tener un índice 0 y un índice 1000 que viene después. Para hacer que las claves de matriz asociativa funcionen, antes de que se agreguen a la matriz C, se convierten en índices C correctos a través de una función hash.

Para una explicación completa, este enlace me pareció mucho más informativo.

http://nikic.github.io/2012/03/28/Understanding-PHPs-internal-array-implementation.html

Cuestiones relacionadas