PHP array di indicizzazione:$array[$indice] vs $array[“$indice”] vs $array[“{$index}”]
Domanda
Qual è la differenza, se esiste, tra questi metodi di indicizzazione in un array PHP:
$array[$index]
$array["$index"]
$array["{$index}"]
Mi interessa sia le prestazioni e le differenze funzionali.
Aggiornamento:
(In risposta a @Jeremy) non sono sicuro che è di destra.Ho eseguito questo codice:
$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);
E ottenuto questo output:
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
)
Soluzione
vedi @svec e @jeremy sopra.Tutti indici di un array sono di tipo 'int' prima, quindi di tipo 'string', e sarà il cast che come PHP vede in forma.
Prestazioni saggio, $indice dovrebbe essere più veloce "$index" e "{$index}" (che sono le stesse).
Una volta che si avvia una virgoletta doppia stringa PHP andrà in modalità di interpolazione e di trattarlo come una stringa di prima, ma cercando variabile marcatori ($, {}, ecc) per sostituire dall'ambito locale.Questo è il motivo per cui nella maggior parte delle discussioni, vero 'statico', stringhe devono essere sempre apici meno che non avete bisogno di fuga-scorciatoie come " " o " ", perché PHP non è necessario provare per interpolare la stringa in fase di esecuzione e la stringa può essere compilato staticamente.
In questo caso, doublequoting sarà la prima copia $indice nella stringa, quindi restituisce la stringa direttamente utilizzando $indice di restituire la stringa.
Altri suggerimenti
Ho cronometrato il 3 modi di utilizzo di un indice di simile a questo:
for ($ii = 0; $ii < 1000000; $ii++) {
// TEST 1
$array[$idx] = $ii;
// TEST 2
$array["$idx"] = $ii;
// TEST 3
$array["{$idx}"] = $ii;
}
La prima serie di test utilizzati $idx=0
, il secondo set usato $idx="0"
, e il terzo set usato $idx="blah"
.Il cronometraggio è stato fatto utilizzando microtime()
diff.Sto usando WinXP, PHP 5.2, Apache 2.2, e Vim.:-)
Ed ecco i risultati:
Utilizzando $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
Utilizzando $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
Utilizzando $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
Così $array[$idx]
è il mani-down vincitore del concorso di esecuzione, almeno sulla mia macchina.(I risultati sono stati molto ripetibile, BTW, l'ho fatto 3 o 4 volte e ha ottenuto gli stessi risultati.)
Credo che da una performance prospettiva che $array["$indice] è più veloce di $array[$indice] Vedi Meglio pratiche per ottimizzare il codice PHP prestazioni
Non credere a tutto quello che leggi così alla cieca...Penso che hai frainteso quello.L'articolo dice $array['indice'] è più veloce di $array[indice] cui si indice una string, non una variabile.Perché se non avvolgere in citazioni PHP cerca un costante var e non riesci a trovare uno, così si presuppone che si intende per rendere una stringa.
Quando i diversi metodi di indicizzazione risolvere diversi indici?
Secondo http://php.net/types.array, un indice di un array può solo essere un intero o una stringa.Se si tenta di utilizzare un galleggiante come un indice, si troncano per intero.Quindi, se $index
è un galleggiante con il valore 3.14, quindi $array[$index]
valuterà per $array[3]
e $array["$index"]
valuterà per $array['3.14']
.Qui è un po ' di codice che lo conferma:
$array = array(3.14 => 'float', '3.14' => 'string');
print_r($array);
$index = 3.14;
echo $array[$index]."\n";
echo $array["$index"]."\n";
L'output:
Array([3] => float [3.14] => string)
float
string
Risposta dell'Aggiornamento:
Oh, hai ragione, credo che PHP è necessario convertire indice di un array di stringhe in numeri se contengono solo cifre.Ho provato questo codice:
$array = array('1' => 100, '2' => 200, 1 => 300, 2 => 400);
print_r($array);
E l'output è:
Array([1] => 300 [2] => 400)
Ho fatto alcuni test e ha scoperto che se un indice di un array (o chiave) è fatta solo di cifre, è sempre convertito in un numero intero, altrimenti si tratta di una stringa.
ejunker:
Puoi spiegare perché è più veloce?Non ci vuole l'interprete di un ulteriore passaggio per analizzare "$indice" nella stringa da utilizzare come un indice invece di utilizzare solo $indice di indice?
Se $indice è una stringa non c'è differenza, perché $indice, "$index" e "{$index}" tutti valutare per la stessa stringa.Se $indice è un numero, per esempio 10, la prima linea di valutare a $array[10] e le altre due linee di valutare a $array["10"], che è un elemento di $array[10].
Credo che da un punto di vista delle prestazioni che $array["$indice] è più veloce di $array[$indice] Vedere Best practice per ottimizzare le prestazioni del codice PHP
Un'altra variante che io uso a volte quando ho un array all'interno di una stringa è:
$str = "this is my string {$array["$index"]}";
Edit:Quello che intendevo dire è di $row[’id’] è più veloce di $row[id]