PHP'de diziyi başlatmanın (boş) en iyi yolu


297

Diğer bazı dillerde (örneğin AS3), yeni bir dizi başlatmanın , nesne oluşturma ve örnekleme nedenlerinden var foo = []ziyade bu şekilde yapılırsa daha hızlı olduğu belirtilmiştir var foo = new Array(). PHP herhangi bir eşdeğer olup olmadığını merak ediyorum?

class Foo {
    private $arr = array(); // is there another / better way?
}

11
Tüm yaptığım bu.
Matthew

2
Yanıt veren herkese teşekkürler (ve çok hızlı!). Keyfi bir cevap seçmem gerekiyordu, bu yüzden Andy en derinlemesine görünüyordu.
Tom Auger

1
Bu soru çok yardımcı oluyor
Hitesh


2
@ zx1986, boş bir dizi oluşturmanın oldukça hantal bir yolu. Kesinlikle OP $arr = array()veya daha az$arr = []
Tom Auger

Yanıtlar:


189

ECMAScript uygulamalarında (örneğin, ActionScript veya JavaScript) Array()bir yapıcı işlevidir ve []dizi değişmez dilbilgisinin bir parçasıdır. Her ikisi de tamamen farklı şekillerde optimize edilir ve yürütülür, gerçek dilbilgisi bir işlevi çağırmanın yükü tarafından desteklenmez.

PHP ise işlevlere benzeyen ancak bu şekilde işlem görmeyen dil yapılarına sahiptir. []Alternatif olarak destekleyen PHP 5.4 ile bile , derleyici / ayrıştırıcı söz konusu olduğunda, tamamen eşanlamlı oldukları için ek yükte bir fark yoktur.

// Before 5.4, you could only write
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// As of PHP 5.4, the following is synonymous with the above
$array = [
    "foo" => "bar",
    "bar" => "foo",
];

PHP'nin eski sürümlerini desteklemeniz gerekiyorsa, eski sözdizimini kullanın. Okunabilirlik konusunda da bir argüman var, ancak uzun süredir JS geliştiricisi olarak, ikincisi benim için oldukça doğal görünüyor. Aslında []PHP'yi ilk öğrendiğimde dizileri başlatmaya çalışırken hata yaptım .

Dilde yapılan bu değişiklik , asıl geliştiriciler tarafından çoğunlukla aşağıdaki nedenlerle yapılan oylama nedeniyle önerildi ve reddedildi:

Bu yama kabul edilmeyecektir çünkü çekirdek geliştiricilerin küçük bir çoğunluğu karşı oy kullandı. Çekirdek geliştiriciler ve kullanıcı oyları arasında birikmiş bir ortalama alırsanız, bunun tersini gösteriyor gibi görünüyor, uzun vadede desteklenmeyen veya sürdürülmeyen bir yama cadı göndermenin sorumluluğu olmayacaktır.

Bununla birlikte, belki de MongoDB (ECMAScript sözdizimini kullanan) gibi popüler veritabanlarına destek uygulamalarından etkilenen kalpte 5.4'e kadar bir değişiklik olduğu görülüyor.


51
Muhtemelen 5.4 değişikliği yapıldı çünkü "hangi" heceleyebilen insanlar oylama sürecini devraldı :)
Rob Grant

40
$array = [];JS ve PHP arasında gidip gelmeyi kolaylaştırdığı için tercih ederim .
Justin

Yani $array = []; daha iyi bir seçenek mi ??? ya da başka birini denemeliyim. hangisi daha iyi
Hitesh

2
@hitesh: Bu kişisel tercih meselesi. Her ikisi de işlevsel olarak tamamen aynıdır, yazmak []biraz daha kolaydır.
Andy E

7
[] Sözdizimi evrensel olarak tercih edilmiş gibi gözükmektedir, ancak hala 5.3'ü kullanan çok sayıda konağın olduğunu not etmek önemlidir. Kodunuzu dağıtmak istiyorsanız, [] sözdizimi ölümcül olur.
vb

204
$myArray = []; 

Boş dizi oluşturur.

Değerleri diziye daha sonra şu şekilde aktarabilirsiniz:

$myArray[] = "tree";
$myArray[] = "house";
$myArray[] = "dog";

Bu noktada, $ myArray "ağaç", "ev" ve "köpek" içerir. Yukarıdaki komutların her biri, önceden var olan öğeleri koruyarak diziye eklenir.

Diğer dillerden geldikten sonra, bir diziye bu şekilde ekleme yapmak bana garip geldi. $ MyArray + = "köpek" ya da bir şey ... ya da belki de Visual Basic koleksiyonları gibi bir "add ()" yöntemi gibi bir şey yapmak bekleniyor. Ancak bu doğrudan ekleme sözdizimi kesinlikle kısa ve kullanışlıdır.

Öğeleri kaldırmak için aslında unset () işlevini kullanmanız gerekir:

unset($myArray[1]); 

... diziden "house" ifadesini kaldıracaktır (diziler sıfır tabanlıdır).

unset($myArray); 

... bütün diziyi yok ederdi.

Açık olmak gerekirse, bir diziye eklemek için boş köşeli parantez sözdizimi, PHP'ye dizinleri SİZİN dizinleri atamak yerine her değere otomatik olarak atamasını söylemenin bir yoludur. Yorganın altında, PHP aslında bunu yapıyor:

$myArray[0] = "tree";
$myArray[1] = "house";
$myArray[2] = "dog";

İsterseniz dizinleri kendiniz atayabilir ve istediğiniz sayıları kullanabilirsiniz. Ayrıca, diğer öğelere değil, bazı öğelere dizin numaraları atayabilirsiniz. Bunu yaparsanız, PHP eksik dizin numaralarını doldurur ve devam ederken atanan en büyük dizin numarasından artar.

Yani bunu yaparsanız:

$myArray[10] = "tree";
$myArray[20] = "house";
$myArray[] = "dog";

... "dog" öğesine 21 endeks numarası verilecektir. PHP artımlı endeks ataması için akıllı desen eşleşmesi yapmaz, bu nedenle "dog" a 30 indeks atamasını isteyeceğinizi bilemez ". Bir dizinin artış şeklini belirtmek için diğer işlevleri kullanabilirsiniz. Burada buna girmeyeceğim, ama hepsi PHP belgelerinde.

Alkış,

- = Cameron


6
$ Ary = [] 'in sadece PHP 5.4 sonrası çalıştığını unutmamak önemlidir. Performans açısından bakıldığında, [] ve array () 'nin avantajı yoktur.
Tom Auger

1
Önceki sürümler için array_push () w3schools.com/php/func_array_push.asp kullanabilirsiniz Bununla ilgili bir performans isabeti olup olmadığını bilmiyorum.
Mark

3
@ TomAuger'in noktasını @ Mark yanlış anladınız. $array[] = 'foo'PHP'nin eski sürümlerinde gayet iyi çalışıyor. Sadece $array = [];5.4'te yeni bir dizi başlatmak.
Codemonkey

Adil olmak gerekirse, bu aslında OP'nin sorusunu cevaplıyor.
Smitty

lol ... Zihin patladı. Onlarca yıl PHP ve sadece array_push gerek olmadığını öğreniyorum.
Bangkokian

61

PHP 5.4'ten önce:

$myArray = array();

PHP 5.4 ve üstü

$myArray = [];

Ve PHP 5.4 veya üstünü kullanarak çok boyutlu dizi nasıl yapabiliriz?
Siraj Alam

26

PHP'de bir dizi bir dizidir; ilkel ve nesne dikkate alınmaz, dolayısıyla karşılaştırılabilir bir optimizasyon yoktur.


1
En iyi cevap IMO: farklı sözdizimleri var, ancak performanslarla ilgili hepsi aynı.
Matthieu Napoli

1
Her ikisi için de performans sorunu var mı .. bu konuda kontrol edebilirsiniz .. herhangi bir bağlantı veya doktor
Hitesh

2
Sonuç olarak, kodunuzun 5.4 öncesi ortamlarda asla çalıştırılmayacağından emin olana kadar, $ array = new array () kullanın
Tom Auger

20

Yaptığınız şey% 100 doğrudur.

Güzel adlandırma açısından, özel / korunan mülklerin önünde, halka açık olmadıklarını açıkça belirtmek için altçizgi kullanılır. örneğin private $_arr = array()veyapublic $arr = array()


2
Php, ben her zaman $thisdeğeri almak için kullanmak ve asla kamu mülkleri kullanmalısınız çünkü onları bir alt çizgi ile adlandırmamak daha iyi olduğunu düşünüyorum .
meze

1
@meze gibi onlara erişeceksin $this->arrve $this->_arr. Neden asla kamu mülklerini kullanmıyorsunuz ?!
James C

5

Bunu dene:

    $arr = (array) null;
    var_dump($arr);

    // will print
    // array(0) { }

4
Çok havalı, ama gerçekten yararlı bir kodlama modelinden ziyade bir parti numarası olarak, öyle değil mi?
Tom Auger

Dizinizi özellikler desenine sahip bir nesnede oluşturmak ve sonunda diziye dönüştürmek istiyorsanız yararlı olabilir.
Jomar Sevillejo

4

Orada başka hiçbir yolu bu en iyisi, bu yüzden.

Düzenleme: Bu yanıt PHP 5.4 ve üstü sürümlerden beri geçerli değildir.


Bu artık geçerli değil, 5.4 diziler için steno sözdizimi getirdi.
Andy E

13
@Motes neden bu kadar nefret: '?.. (Şaka bir yana, ben eski yanıt 'çarpıcı' tarafından daha açık hale getirdik Bir acemi cevap değiştiğini anlamak için hala yararlı olabilir
Matthieu Napoli

@Motes İnsanlar sildikleri zaman cevaptan kazançlarını kaybederler. Düzenlemek daha iyi.
mbomb007

4

Basit bir dizi başlatma:

<?php $array1=array(10,20,30,40,50); ?>

Dizi içindeki dizi başlatılıyor:

<?php  $array2=array(6,"santosh","rahul",array("x","y","z")); ?>

Kaynak: Kod için sorce


3
Orijinal soru, boş bir dizinin nasıl başlatılacağıyla ilgiliydi .
Tom Auger
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.