Indexación de matrices PHP:$matriz[$índice] vs $matriz[“$índice”] vs $matriz[“{$índice}”]

StackOverflow https://stackoverflow.com/questions/6628

  •  08-06-2019
  •  | 
  •  

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
)
¿Fue útil?

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]

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top