2012-04-13 10 views
9

Como programador PHP, uso matrices para casi todo. Sé que SPLFixedArray puede ser útil en ciertos casos, y sé PHP arrays aren't very memory efficient, pero rara vez me he encontrado con casos reales en los que luchan por hacer lo que necesito.¿Cuáles son las características del tipo de matriz de PHP como estructura de datos?

Esto en contraste con cuando estoy trabajando en Java, donde me resulta absolutamente fundamental que entiendo exactamente qué estructuras de datos estoy usando, y los pros y contras de cada uno. Si alguien sugiriera que utilizo un LinkedHashMap para todo en Java, se echaría a reír del edificio.

Entonces, ¿cómo podemos hacernos con una ingeniería tan rápida y flexible en PHP? ¿Cuáles son los detalles subyacentes de las matrices PHP? A menudo se describe como "un mapa ordenado", pero deja mucho de la implementación a la especulación.

¿Cuáles son algunos casos de uso Arrays PHP son particularmente bueno en? ¿Cuáles son algunos casos de uso aparentemente simples que las matrices de PHP son realmente bastante malo en?

Por ejemplo, supongo que hay algún tipo de mejor manejo de matrices con enteros densos (por ejemplo, $arr = array('a','b','c','d','e');) que un mapa hash ordenado, pero ¿dónde está el límite entre denso y disperso? ¿Las matrices se vuelven dramáticamente menos eficientes tan pronto como introduzco incluso una clave no ordenada, como $arr[10] = 'f';? ¿Qué hay de $arr[1000000] = 'g';? Supongo que PHP no ocupa el ~ 1 millón de ranuras entremedio, pero si se trata de una lista vinculada debajo de las cubiertas, presumiblemente llamando a $arr[rand()] = rand(); repetidamente tendría que hacer un nuevo pedido después de cada inserción?

Cualquier respuesta que explore las características subyacentes de las matrices PHP es bienvenida, incluso si no aborda las preguntas específicas que planteo.

+1

¿Porque nadie espera que PHP funcione bien? –

+0

En realidad, [no hay ningún reordenamiento involucrado] (http://codepad.org/V0Y9K9MZ). Cuando asigna una clave inexistente, se pone al final de la matriz. – Ryan

+6

Me sorprende que el universo no se haya reiniciado después de que alguien usó 'PHP' y' strengths' en la misma oración. –

Respuesta

1

El problema fundamental de las matrices de PHP es que son un mash-up de dos tipos de datos diferentes: matrices y mapas. Las matrices a la Javascript o Python son simples listas ordenadas, indexadas numéricamente a partir de 0. Muy fácil de entender y usar. Los mapas (también conocidos como diccionarios) son colecciones (por lo general desordenadas) de pares clave-valor. Nuevamente, muy simple de entender y usar.

Las matrices PHP pueden ser ambas, y actúan como ambas, dependiendo de lo que haga con ellas, y ciertas operaciones que usan las funciones de matriz de PHP pueden hacer que se comporten de maneras inesperadas. Las claves de matriz pueden ser (por ejemplo) cadenas o enteros, pero no puede tener una clave de cadena que sea numérica, ya que PHP la convertirá forzosamente en un entero, sin importar lo que haga. Esto puede crear problemas cuando (por ejemplo) convierta datos ay desde JSON, ya que puede terminar con varias claves numéricas similares de diferentes tipos.

Los desarrolladores de PHP deberían haber mantenido los dos tipos de datos distintos. Puede ser conveniente usar la notación de matriz para hacer un mapa sobre la marcha, pero no deberían haberlo hecho. No soy un gran admirador de Python (... aún) pero la distinción formal entre listas y mapas es una cosa que ciertamente han hecho mejor que PHP.

1

Las matrices PHP son increíbles en el modelado de coordenadas de espacio arbitrarias. Puede crear fácilmente un caché de valores de ruido de perlin: positivo, negativo, etc.

Las matrices PHP son excelentes para representar objetos de configuración. Los tipos de teclas flexibles lo hacen muy fácil.

Las matrices de PHP lo confunden con la diferencia entre una clave y un índice. Muy mal.

Las matrices PHP son generalmente más lentas, aunque podrían ser PHP en sí y no realmente las matrices, y siempre te dan más opciones de las que realmente necesitas. Conduce a preguntas horribles como éste:

PHP: Best way to iterate two parallel arrays?

Basta con mirar a sus matrices. Ellos son ... ¿qué son? ¿Lista de parámetros arbitrarios?

¡Otra cosa en la que las matrices php son geniales!

$class->call('func', Array(..params..)); 
+0

Tenía la esperanza de obtener un poco más de discusión sobre las estructuras de datos subyacentes, pero gracias por su aporte. – dimo414

+0

@ dimo414 Entonces, ¿por qué aceptaste el contestador? – k0pernikus

+0

No recibió más comentarios después de más de 6 meses. Eliminaré si crees que obtendré más. – dimo414

Cuestiones relacionadas