w3school script example checker php syntax

script - php variables



Indexación de matrices PHP: $ array (7)

¿Cuál es la diferencia, si existe, entre estos métodos de indexación en una matriz PHP?

$array[$index] $array["$index"] $array["{$index}"]

Estoy interesado en el rendimiento y las diferencias funcionales.

Actualizar:

(En respuesta a @Jeremy) No estoy seguro de que sea correcto. Ejecuté este código:

$array = array(100, 200, 300); print_r($array); $idx = 0; $array[$idx] = 123; print_r($array); $array["$idx"] = 456; print_r($array); $array["{$idx}"] = 789; print_r($array);

Y obtuve esta salida:

Array ( [0] => 100 [1] => 200 [2] => 300 ) Array ( [0] => 123 [1] => 200 [2] => 300 ) Array ( [0] => 456 [1] => 200 [2] => 300 ) Array ( [0] => 789 [1] => 200 [2] => 300 )


Creo que desde una perspectiva de rendimiento, $ array ["$ index"] es más rápido que $ array [$ index] Ver Mejores prácticas para optimizar el rendimiento del código PHP

No creas todo lo que lees tan ciegamente ... Creo que malinterpretaste eso. El artículo dice que $ array [''index''] es más rápido que $ array [index] donde index es una cadena , no una variable. Eso es porque si no lo envuelves entre comillas PHP busca una var constante y no puede encontrar una, por lo que supone que quisiste convertirla en una cadena.


Creo que desde una perspectiva de rendimiento, $ array ["$ index"] es más rápido que $ array [$ index] Ver Mejores prácticas para optimizar el rendimiento del código PHP

Otra variación que uso a veces cuando tengo una matriz dentro de una cadena es:

$str = "this is my string {$array["$index"]}";

Editar: Lo que quise decir es que $ row [''id''] es más rápido que $ row [id]


Si $ index es una cadena, no hay diferencia porque $ index, "$ index", y "{$ index}" todos evalúan a la misma cadena. Si $ index es un número, por ejemplo 10, la primera línea evaluará $ array [10] y las otras dos líneas evaluarán $ array ["10"], que es un elemento diferente de $ array [10].


ver @svec y @jeremy arriba. Todos los índices de matriz son de tipo ''int'' primero, luego escriba ''cadena'', y se convertirán en tal como PHP considere apropiado.

En cuanto al rendimiento, el índice $ debe ser más rápido que "$ index" y "{$ index}" (que son iguales).

Una vez que inicie una secuencia de comillas dobles, PHP pasará al modo de interpolación y lo tratará primero como una cadena, pero buscando marcadores de variables ($, {}, etc.) para reemplazarlos del ámbito local. Esta es la razón por la cual en la mayoría de las discusiones, las cadenas "estáticas" verdaderas siempre deben ser comillas simples a menos que necesites los atajos de escape como "/ n" o "/ t", porque PHP no necesitará tratar de interpolar la cadena en tiempo de ejecución y el cadena completa se puede compilar estáticamente.

En este caso, doublequoting copiará primero el índice $ en esa cadena, luego devolverá la cadena, donde directamente usando $ index solo devolverá la cadena.


¿Cuándo se resolverán los diferentes métodos de indexación a diferentes índices?

Según http://php.net/types.array , un índice de matriz solo puede ser un número entero o una cadena. Si intenta usar un flotador como índice, lo truncará a entero. Entonces si $index es un float con el valor 3.14, entonces $array[$index] evaluará a $array[3] y $array["$index"] evaluará a $array[''3.14''] . Aquí hay un código que confirma esto:

$array = array(3.14 => ''float'', ''3.14'' => ''string''); print_r($array); $index = 3.14; echo $array[$index]."/n"; echo $array["$index"]."/n";

La salida:

Array([3] => float [3.14] => string) float string


Respuesta a la actualización:

Ah, tienes razón, supongo que PHP debe convertir cadenas de índice de matriz a números si contienen solo dígitos. Intenté este código:

$array = array(''1'' => 100, ''2'' => 200, 1 => 300, 2 => 400); print_r($array);

Y la salida fue:

Array([1] => 300 [2] => 400)

He hecho algunas pruebas más y descubrí que si un índice (o clave) de una matriz está compuesto solo de dígitos, siempre se convierte en un entero, de lo contrario, es una cadena.

ejunker:

¿Puedes explicar por qué es más rápido? ¿No le toma al intérprete un paso adicional para analizar el "$ index" en la cadena para usar como índice en lugar de solo usar $ index como índice?


Calculé las 3 formas de usar un índice como este:

for ($ii = 0; $ii < 1000000; $ii++) { // TEST 1 $array[$idx] = $ii; // TEST 2 $array["$idx"] = $ii; // TEST 3 $array["{$idx}"] = $ii; }

El primer conjunto de pruebas usó $idx=0 , el segundo conjunto usó $idx="0" , y el tercer conjunto usó $idx="blah" . El tiempo se hizo usando microtime() diffs. Estoy usando WinXP, PHP 5.2, Apache 2.2 y Vim. :-)

Y aquí están los resultados:

Usando $idx = 0

$array[$idx] // time: 0.45435905456543 seconds $array["$idx"] // time: 1.0537171363831 seconds $array["{$idx}"] // time: 1.0621709823608 seconds ratio "$idx" / $idx // 2.3191287282497 ratio "{$idx}" / $idx // 2.3377348193858

Usando $idx = "0"

$array[$idx] // time: 0.5107250213623 seconds $array["$idx"] // time: 0.77445602416992 seconds $array["{$idx}"] // time: 0.77329802513123 seconds ratio "$idx" / $idx // = 1.5163855142717 ratio "{$idx}" / $idx // = 1.5141181512285

Usando $idx = "blah"

$array[$idx] // time: 0.48077392578125 seconds $array["$idx"] // time: 0.73676419258118 seconds $array["{$idx}"] // time: 0.71499705314636 seconds ratio "$idx" / $idx // = 1.5324545551923 ratio "{$idx}" / $idx // = 1.4871793473086

Entonces $array[$idx] es el ganador indiscutible de la competencia de rendimiento, al menos en mi máquina. (Los resultados fueron muy repetibles, por cierto, lo ejecuté 3 o 4 veces y obtuve los mismos resultados).