PHP-Array-Indizierung:$array[$index] vs. $array[„$index“] vs. $array[„{$index}“]

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

  •  08-06-2019
  •  | 
  •  

Frage

Was ist der Unterschied (falls vorhanden) zwischen diesen Methoden der Indizierung in ein PHP-Array:

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

Mich interessieren sowohl die Leistungs- als auch die Funktionsunterschiede.

Aktualisieren:

(Antwort an @Jeremy) Ich bin mir nicht sicher, ob das richtig ist.Ich habe diesen Code ausgeführt:

  $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);

Und habe diese Ausgabe erhalten:

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
)
War es hilfreich?

Lösung

siehe @svec und @jeremy oben.Alle Array-Indizes sind zuerst vom Typ „int“, dann vom Typ „string“ und werden nach PHP in diesen umgewandelt.

In Bezug auf die Leistung sollte $index schneller sein als „$index“ und „{$index}“ (die gleich sind).

Sobald Sie eine Zeichenfolge in doppelten Anführungszeichen beginnen, wechselt PHP in den Interpolationsmodus und behandelt sie zunächst als Zeichenfolge, sucht jedoch nach Variablenmarkierungen ($, {} usw.), die aus dem lokalen Bereich ersetzt werden können.Aus diesem Grund sollten in den meisten Diskussionen echte „statische“ Zeichenfolgen immer in einfache Anführungszeichen gesetzt werden, es sei denn, Sie benötigen Escape-Verknüpfungen wie „ “ oder „ “, da PHP nicht versuchen muss, die Zeichenfolge zur Laufzeit zu interpolieren Die vollständige Zeichenfolge kann statisch kompiliert werden.

In diesem Fall wird durch doppelte Anführungszeichen zuerst $index in diese Zeichenfolge kopiert und dann die Zeichenfolge zurückgegeben, während die direkte Verwendung von $index lediglich die Zeichenfolge zurückgibt.

Andere Tipps

Ich habe die drei Möglichkeiten zur Verwendung eines Index wie folgt festgelegt:

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

Der erste Satz verwendeter Tests $idx=0, der zweite verwendete Satz $idx="0", und der dritte Satz verwendet $idx="blah".Die Zeitmessung erfolgte mit microtime() Unterschiede.Ich verwende WinXP, PHP 5.2, Apache 2.2 und Vim.:-)

Und hier sind die Ergebnisse:

Benutzen $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

Benutzen $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

Benutzen $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

Also $array[$idx] ist der klare Sieger des Leistungswettbewerbs, zumindest auf meiner Maschine.(Die Ergebnisse waren sehr wiederholbar. Übrigens habe ich es drei- oder viermal ausgeführt und die gleichen Ergebnisse erzielt.)

Ich glaube aus der Perspektive der Leistung, dass $ array ["$ index"] schneller ist als $ Array [$ Index] Sehen

Glauben Sie nicht alles, was Sie so blind lesen...Ich glaube, Sie haben das falsch interpretiert.Der Artikel besagt, dass $array['index'] schneller ist als $array[index], wobei index ein ist Zeichenfolge, keine Variable.Das liegt daran, dass PHP, wenn Sie es nicht in Anführungszeichen setzen, nach einer konstanten Variable sucht und keine finden kann. Daher geht es davon aus, dass Sie es zu einem String machen wollten.

Wann werden die verschiedenen Indizierungsmethoden in unterschiedliche Indizes aufgelöst?

Entsprechend http://php.net/types.array, ein Array-Index kann nur eine Ganzzahl oder eine Zeichenfolge sein.Wenn Sie versuchen, einen Float als Index zu verwenden, wird dieser auf eine Ganzzahl gekürzt.Also wenn $index ist also ein Float mit dem Wert 3,14 $array[$index] werde bewerten $array[3] Und $array["$index"] werde bewerten $array['3.14'].Hier ist ein Code, der dies bestätigt:

$array = array(3.14 => 'float', '3.14' => 'string');
print_r($array);

$index = 3.14;
echo $array[$index]."\n";
echo $array["$index"]."\n";

Die Ausgabe:

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

Antwort auf das Update:

Oh, Sie haben Recht, ich vermute, PHP muss Array-Indexzeichenfolgen in Zahlen umwandeln, wenn sie nur Ziffern enthalten.Ich habe diesen Code ausprobiert:

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

Und die Ausgabe war:

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

Ich habe einige weitere Tests durchgeführt und festgestellt, dass ein Array-Index (oder Schlüssel), der nur aus Ziffern besteht, immer in eine Ganzzahl konvertiert wird, andernfalls ist er eine Zeichenfolge.

ejunker:

Können Sie erklären, warum das schneller ist?Benötigt der Interpreter nicht einen zusätzlichen Schritt, um „$index“ in die Zeichenfolge zu analysieren, die als Index verwendet werden soll, anstatt nur $index als Index zu verwenden?

Wenn $index eine Zeichenfolge ist, gibt es keinen Unterschied, da $index, „$index“ und „{$index}“ alle dieselbe Zeichenfolge ergeben.Wenn $index eine Zahl ist, zum Beispiel 10, wird die erste Zeile zu $array[10] ausgewertet und die anderen beiden Zeilen werden zu $array["10"] ausgewertet, was ein anderes Element als $array[10] ist.

Ich glaube aus Leistungssicht, dass $array["$index"] schneller ist als $array[$index] Siehe Best Practices zur Optimierung der PHP-Codeleistung

Eine andere Variante, die ich manchmal verwende, wenn ich ein Array in einem String habe, ist:

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

Bearbeiten:Was ich damit sagen wollte ist, dass $row[’id’] schneller ist als $row[id’]

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top