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