PHP dizi indeksleme: $ dizi vs $ dizi [$ index] $ dizi vs ["$ index"] ["{$ index}"]

8 Cevap php

Ne bir PHP diziye indeksleme bu yöntemler arasında, eğer varsa, fark:

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

Ben performans ve işlevsel farklılıkları hem de ilgileniyorum.

Update:

(Jeremy @ cevaben) bunun doğru olduğundan emin değilim. Ben bu kodu koştum:

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

Ve bu çıktıyı aldım:

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
)

8 Cevap

Svec'e @ ve yukarıdaki jeremy @ bakın. Tüm dizi endeksleri ilk, sonra 'dizesi' yazın türü 'int' vardır, ve PHP uygun gördüğü şekilde buna atılacaktır.

Performans açısından, $ index "$ endeksi" daha hızlı ve "{$ index}" (aynı olan) olmalıdır.

Eğer bir çift tırnak dize başladığınızda, PHP enterpolasyon moduna geçmesi ve ilk bir dize gibi davranın, ama değişken belirteçleri ($ {}, vb) için arayan yerel kapsamından yerine olacaktır. Bu PHP zamanında dize sokmak için denemek gerekmez çünkü "\ n" veya "\ t" gibi kaçış kısayolları gerekmedikçe çoğu tartışmalar, gerçek 'statik' dizeleri her zaman tek tırnak olmalıdır neden olduğu ve Tam dize statik derlenmiş olabilir.

Doğrudan $ dizini kullanarak sadece dize dönecektir nerede bu durumda, doublequoting ilk dize dönmek, sonra o dizeye $ endeksi kopyalar.

Ben böyle bir dizin kullanma yollarını 3 zamanlı:

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

$idx=0, ikinci seti $idx="0" kullanılan kullanılan testlerin ilk seti ve kullanılan üçüncü set $idx="blah". Zamanlama microtime() fark dosyaları kullanılarak yapıldı. Ben WinXP, PHP 5.2, Apache 2.2 ve Vim kullanıyorum. :-)

Ve işte sonuçlar:

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

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

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

Yani $array[$idx] en azından benim makinede performans rekabet, eller aşağı kazanır. (Sonuçlar MEZUNLARI, ben bunu 3 ya da 4 kez koştu ve aynı sonuçları var, çok tekrarlanabilir.)

I believe from a performance perspective that $array["$index"] is faster than $array[$index] See Best practices to optimize PHP code performance

Bunu körü körüne okumak her şeye inanmayın ... Bunu yanlış düşünüyorum. Makale $ dizi ['index'] endeksi string, bir değişken değildir $ dizi [indeks] daha hızlı olduğunu söylüyor. Eğer tırnak sarın yoksa PHP sürekli var arar ve bir o yüzden bir dize yapmak anlamına varsayar bulamıyorum olmasıdır.

On a bit of a side note, $array[$index] does not produce any notices/warnings where $array[3] will throw a message (notice level I think) about 3 being an undefined constant.

Bu kesinlikle doğru değildir.

Ne zaman farklı indeksleme yöntemleri farklı endekslere çözecek?

Http://php.net/types.array göre, bir dizi dizin sadece bir tamsayı ya da bir dize olabilir. Eğer bir indeks olarak bir float kullanmaya çalışırsanız, o tamsayı keser. $ Endeks değeri 3.14 olan bir şamandıra olup olmadığını Yani, o zaman $ dizi [$ index] [3] ve $ dizi ["$ index"] $ dizi ['3 .14 '] değerlendirecek $ diziye değerlendirecek. İşte bu teyit bazı kod:

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

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

Çıktı:

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

Response to the Update:

Oh, sen haklısın, ben sadece basamak içeriyorsa PHP numaralara dizi indeksi dizeleri dönüştürmek gerekir sanırım. Bu kod çalıştı:

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

Ve çıkış oldu:

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

Birkaç test daha yapmış ve bir dizi dizin (veya anahtar) sadece rakamlardan oluşur ise, her zaman aksi takdirde bir dize var, bir tam sayıya dönüştürülür bulduk.

ejunker:

Bu hızlı neden açıklayabilir misiniz? Sadece endeksi olarak $ indeksi kullanılarak yerine bir göstergesi olarak kullanmak için dizeye "$ index" ayrıştırmak için çevirmen fazladan bir adım atmıyor?

$ Dizin bir dize ise $ indeks, "$ index" ve "{$ index}" Tüm aynı dize değerlendirmek, çünkü hiçbir fark yoktur. $ Dizin bir sayı ise, örneğin 10, ilk satırı $ dizi [10] değerlendirecek ve diğer iki satır $ dizi $ dizi [10] farklı bir unsurdur ["10"] değerlendirecek.

Ben $ dizi ["$ index"] Bkz Best practices to optimize PHP code performance $ dizi [$ indeks] daha hızlı bir performans açısından inanıyorum

Ben bir dize içinde bir dizi varsa ben bazen kullanmak başka bir çeşididir:

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

Düzenleme: Ben $ row ['id'] doları satırda [id] daha hızlı olduğunu söylemek istedim ne