Indexación de matrices PHP:$matriz[$índice] vs $matriz[“$índice”] vs $matriz[“{$índice}”]
Pregunta
¿Cuál es la diferencia, si la hay, entre estos métodos de indexación en una matriz PHP?
$array[$index]
$array["$index"]
$array["{$index}"]
Estoy interesado tanto en el rendimiento como en 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 este resultado:
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
)
Solución
ver @svec y @jeremy arriba.Todos los índices de matriz son de tipo 'int' primero, luego escriben 'cadena' y se convertirán en eso como PHP lo considere oportuno.
En cuanto al rendimiento, $index debería ser más rápido que "$index" y "{$index}" (que son iguales).
Una vez que inicie una cadena entre comillas dobles, PHP entrará en modo de interpolación y la tratará como una cadena primero, pero buscará marcadores de variables ($, {}, etc.) para reemplazar desde el ámbito local.Esta es la razón por la que en la mayoría de las discusiones, las cadenas 'estáticas' verdaderas siempre deben estar entre comillas simples a menos que necesite atajos de escape como " " o " ", porque PHP no necesitará intentar interpolar la cadena en tiempo de ejecución y el La cadena completa se puede compilar estáticamente.
En este caso, las comillas dobles primero copiarán el índice $ en esa cadena, luego devolverán la cadena, mientras que el uso directo de $index simplemente devolverá la cadena.
Otros consejos
Calculé el tiempo de 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 utilizadas. $idx=0
, el segundo conjunto utilizado $idx="0"
, y el tercer conjunto utilizado $idx="blah"
.El cronometraje se realizó usando microtime()
diferencias.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).
Creo desde una perspectiva de rendimiento de que $ Array ["$ índice"] es más rápido que $ matriz [$ índice] Consulte las mejores prácticas para optimizar el rendimiento del código PHP
No creas todo lo que lees tan ciegamente...Creo que lo malinterpretaste.El artículo dice que $array['index'] es más rápido que $array[index] donde index es un cadena, no una variable.Esto se debe a que si no lo envuelve entre comillas, PHP busca una var constante y no puede encontrarla, por lo que supone que desea convertirla en una cadena.
¿Cuándo se resolverán los diferentes métodos de indexación en diferentes índices?
De acuerdo a http://php.net/types.array, un índice de matriz solo puede ser un número entero o una cadena.Si intenta utilizar un flotante como índice, lo truncará a un número entero.Así que si $index
es un flotante 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:
Oh, tienes razón, supongo que PHP debe convertir cadenas de índice de matriz en números si solo contienen dígitos.Probé este código:
$array = array('1' => 100, '2' => 200, 1 => 300, 2 => 400);
print_r($array);
Y el resultado fue:
Array([1] => 300 [2] => 400)
Hice algunas pruebas más y descubrí que si un índice de matriz (o clave) se compone solo de dígitos, siempre se convierte en un número entero; de lo contrario, es una cadena.
ejunker:
¿Puedes explicar por qué eso es más rápido?¿No le toma al intérprete un paso adicional para analizar "$index" en la cadena para usarlo como índice en lugar de simplemente usar $index como índice?
Si $index es una cadena, no hay diferencia porque $index, "$index" y "{$index}" se evalúan como la misma cadena.Si $index es un número, por ejemplo 10, la primera línea se evaluará como $array[10] y las otras dos líneas se evaluarán como $array["10"], que es un elemento diferente a $array[10].
Creo que desde una perspectiva de rendimiento que $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]