Cara terbaik untuk menginisialisasi array (kosong) dalam PHP

297

Dalam bahasa-bahasa lain tertentu (misalnya AS3), telah dicatat bahwa menginisialisasi array baru lebih cepat jika dilakukan seperti ini var foo = []daripada var foo = new Array()karena alasan pembuatan objek dan instantiasi. Saya bertanya-tanya apakah ada persamaan dalam PHP?

class Foo {
    private $arr = array(); // is there another / better way?
}
Tom Auger
sumber
11
Itu saja yang pernah saya lakukan.
Matius
2
Terima kasih kepada semua orang yang menjawab (dan begitu cepat!). Saya harus memilih jawaban secara sewenang-wenang sehingga Andy sepertinya yang paling mendalam.
Tom Auger
1
Pertanyaan ini banyak membantu
Hitesh
2
@ zx1986 itu cara yang cukup rumit untuk membuat array kosong. Tentu saja kurang dari OP $arr = array()atau$arr = []
Tom Auger

Jawaban:

189

Dalam implementasi ECMAScript (misalnya, ActionScript atau JavaScript), Array()adalah fungsi konstruktor dan []merupakan bagian dari tata bahasa literal array. Keduanya dioptimalkan dan dieksekusi dengan cara yang benar-benar berbeda, dengan tata bahasa literal tidak dikendalikan oleh overhead memanggil suatu fungsi.

PHP, di sisi lain, memiliki konstruksi bahasa yang mungkin terlihat seperti fungsi tetapi tidak diperlakukan seperti itu. Bahkan dengan PHP 5.4, yang mendukung []sebagai alternatif, tidak ada perbedaan dalam overhead karena, sejauh menyangkut kompiler / parser, mereka sepenuhnya identik.

// 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",
];

Jika Anda perlu mendukung versi PHP yang lebih lama, gunakan sintaksis sebelumnya. Ada juga argumen untuk keterbacaan tetapi, sebagai pengembang JS lama, yang terakhir tampaknya agak alami bagi saya. Saya sebenarnya membuat kesalahan dengan mencoba menginisialisasi array menggunakan []ketika saya pertama kali belajar PHP.

Ini perubahan ke bahasa awalnya diusulkan dan ditolak karena suara mayoritas terhadap pengembang inti dengan alasan berikut:

Patch ini tidak akan diterima karena sebagian besar pengembang inti memilih menentang. Meskipun jika Anda mengambil akumulasi rata-rata antara pengembang inti dan suara pengguna tampaknya menunjukkan sebaliknya, akan tidak bertanggung jawab untuk mengirimkan penyihir tambalan tidak didukung atau dipertahankan dalam jangka panjang.

Namun, tampaknya ada perubahan hati yang mengarah ke 5.4, mungkin dipengaruhi oleh implementasi dukungan untuk database populer seperti MongoDB (yang menggunakan sintaksis ECMAScript).

Andy E
sumber
51
Mungkin perubahan 5,4 dibuat karena orang yang bisa mengeja "yang" mengambil alih proses pemungutan suara :)
Rob Grant
40
Saya lebih suka $array = [];karena membuat bolak-balik antara JS dan PHP lebih mudah.
Justin
Jadi, apakah $array = []; opsi yang lebih baik ??? atau saya harus mencoba yang lain. mana yang lebih baik
Hitesh
2
@hitesh: ini masalah preferensi pribadi. Keduanya sama persis secara fungsional, []hanya sedikit lebih mudah untuk diketik.
Andy E
7
Sintaks [] tampaknya lebih disukai secara universal, tetapi penting untuk dicatat bahwa ada sejumlah besar host yang masih menggunakan 5.3 secara eksklusif. Jika Anda ingin mendistribusikan kode Anda, sintaks [] akan berakibat fatal.
dll
204
$myArray = []; 

Membuat array kosong.

Anda bisa mendorong nilai ke array nanti, seperti:

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

Pada titik ini, $ myArray berisi "tree", "house" dan "dog". Masing-masing perintah di atas ditambahkan ke array, menjaga item yang sudah ada di sana.

Karena berasal dari bahasa lain, cara menambahkan array ini terasa aneh bagi saya. Saya diharapkan harus melakukan sesuatu seperti $ myArray + = "dog" atau sesuatu ... atau mungkin metode "add ()" seperti koleksi Visual Basic miliki. Tetapi sintaks append langsung ini tentu saja pendek dan nyaman.

Anda sebenarnya harus menggunakan fungsi unset () untuk menghapus item:

unset($myArray[1]); 

... akan menghapus "rumah" dari array (array berbasis nol).

unset($myArray); 

... akan menghancurkan seluruh array.

Agar jelas, sintaks kurung kotak kosong untuk menambahkan ke array hanyalah cara memberitahu PHP untuk menetapkan indeks untuk setiap nilai secara otomatis, daripada ANDA yang menetapkan indeks. Di bawah selimut, PHP sebenarnya melakukan ini:

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

Anda dapat menetapkan indeks sendiri jika Anda inginkan, dan Anda dapat menggunakan nomor apa pun yang Anda inginkan. Anda juga dapat menetapkan nomor indeks untuk beberapa item dan bukan yang lain. Jika Anda melakukan itu, PHP akan mengisi angka indeks yang hilang, bertambah dari angka indeks terbesar yang ditetapkan.

Jadi, jika Anda melakukan ini:

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

... item "dog" akan diberi nomor indeks 21. PHP tidak melakukan pencocokan pola cerdas untuk penugasan indeks tambahan, jadi ia tidak akan tahu bahwa Anda mungkin menginginkannya untuk menetapkan indeks 30 untuk "dog ". Anda bisa menggunakan fungsi lain untuk menentukan pola kenaikan untuk array. Saya tidak akan membahasnya di sini, tetapi semuanya ada dalam dokumen PHP.

Bersulang,

- = Cameron

C Landreaux
sumber
6
Penting untuk dicatat bahwa $ ary = [] hanya berfungsi memposting PHP 5.4. Namun dari perspektif kinerja tidak ada keuntungan untuk [] vs. array ().
Tom Auger
1
Untuk versi sebelumnya, Anda dapat menggunakan array_push () w3schools.com/php/func_array_push.asp Saya tidak tahu apakah ada hit kinerja yang terkait dengan ini.
Tandai
3
Anda salah mengerti poin @ TomAuger @ Mark. $array[] = 'foo'berfungsi dengan baik di versi PHP yang lebih lama. Ini hanya $array = [];untuk menginisialisasi array yang baru di 5.4.
Codemonkey
Agar adil, ini sebenarnya menjawab pertanyaan OP.
Smitty
lol ... Pikiran meledak. Beberapa dekade PHP dan saya baru belajar Anda tidak perlu array_push.
Bangkok
61

Sebelum ke PHP 5.4:

$myArray = array();

PHP 5.4 dan lebih tinggi

$myArray = [];
Md. Shafiqur Rahman
sumber
Dan bagaimana kita bisa membuat array multidimensi menggunakan PHP 5.4 atau lebih tinggi?
Siraj Alam
26

Dalam PHP array adalah array; tidak ada pertimbangan primitif vs objek, jadi tidak ada optimasi yang sebanding yang bisa didapat.

Adrian
sumber
1
Jawaban terbaik IMO: ada beberapa sintaks yang berbeda, tetapi mengenai performa mereka semua sama.
Matthieu Napoli
1
Apakah ada masalah kinerja yang terlibat untuk keduanya .. Di mana saya dapat memeriksa tentang ini .. tautan atau dokumen apa pun
Hitesh
2
Akibatnya, hingga Anda yakin kode Anda tidak akan pernah berjalan di lingkungan pra 5.4, gunakan $ array = array baru ()
Tom Auger
20

Apa yang Anda lakukan adalah 100% benar.

Dalam hal penamaan yang bagus sering dilakukan bahwa properti pribadi / dilindungi didahului dengan garis bawah untuk membuatnya jelas bahwa mereka tidak bersifat publik. Misalnya private $_arr = array()ataupublic $arr = array()

James C
sumber
2
Dalam php, saya pikir lebih baik untuk tidak memberi nama mereka dengan garis bawah karena Anda selalu menggunakan $thisuntuk mendapatkan nilai dan tidak boleh menggunakan properti publik.
meze
1
@memastikan Anda akan mengaksesnya seperti $this->arrdan $this->_arr. Mengapa Anda tidak boleh menggunakan properti publik ?!
James C
5

Coba ini:

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

    // will print
    // array(0) { }
Pyetro
sumber
4
Agak keren, tetapi lebih sebagai trik pesta daripada pola pengkodean yang sangat berguna, bukan begitu?
Tom Auger
Bisa berguna jika Anda ingin membuat array di objek dengan pola properti dan mengubahnya menjadi array pada akhirnya.
Jomar Sevillejo
4

Ada ada cara lain , jadi ini yang terbaik.

Sunting: Jawaban ini tidak valid sejak PHP 5.4 dan lebih tinggi.

Matthieu Napoli
sumber
Ini tidak lagi menjadi kasus, 5.4 memperkenalkan sintaks singkatan untuk array.
Andy E
13
@Motes Mengapa sangat benci: '(? Mengesampingkan, saya sudah membuatnya lebih eksplisit dengan "memukul" jawaban lama. Masih mungkin berguna bagi seorang pemula untuk memahami bahwa jawabannya telah berubah.
Matthieu Napoli
@Motes Orang kehilangan perolehan perwakilan dari jawaban ketika mereka menghapusnya. Lebih baik mengeditnya.
mbomb007
4

Menginisialisasi array sederhana:

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

Inisialisasi array dalam array:

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

Sumber: Sorce untuk kode

improgrammer
sumber
3
Pertanyaan aslinya adalah tentang bagaimana menginisialisasi array kosong .
Tom Auger