Pertanyaan tentang ' Bagaimana cara mengetahui apakah array PHP kosong ' ini membuat saya memikirkan pertanyaan ini
Apakah ada alasan yang count
harus digunakan daripada empty
saat menentukan apakah sebuah array kosong atau tidak?
Pemikiran pribadi saya adalah jika 2 setara untuk kasus larik kosong yang harus Anda gunakan empty
karena memberikan jawaban boolean untuk pertanyaan boolean. Dari pertanyaan yang ditautkan di atas, tampaknya itulah count($var) == 0
metode yang populer. Bagi saya, meski secara teknis benar, tidak masuk akal. Misalnya Q: $ var, apakah Anda kosong? J: 7 . Hmmm...
Adakah alasan saya harus menggunakan count == 0
sebagai gantinya atau hanya masalah selera pribadi?
Seperti yang ditunjukkan oleh orang lain dalam komentar untuk jawaban yang sekarang dihapus, count
akan berdampak pada kinerja untuk array besar karena harus menghitung semua elemen, sedangkan empty
dapat berhenti segera setelah mengetahui bahwa itu tidak kosong. Jadi, jika mereka memberikan hasil yang sama dalam kasus ini, tetapi count
berpotensi tidak efisien, mengapa kami menggunakan count($var) == 0
?
false
di PHP - tidak perluempty()
ataucount()
.if (!$myArray) { echo "array is empty"; }
sandbox.onlinephpfunctions.com/code/…empty()
.Jawaban:
Saya biasanya menggunakan
empty
. Saya tidak yakin mengapa orang benar-benar menggunakan hitungan - Jika array besar maka hitungan membutuhkan waktu lebih lama / memiliki lebih banyak overhead. Jika Anda hanya ingin mengetahui apakah array kosong atau tidak, gunakan kosong.sumber
O(1)
, karena PHP menyimpan jumlah elemen secara internal. Lihat jawaban ini stackoverflow.com/a/5835419/592454Saya penasaran ingin melihat mana yang sebenarnya lebih cepat jadi saya membuat skrip sederhana untuk mengukur fungsi tersebut.
Karena saya melakukannya, saya juga mencoba memeriksa kinerja melakukan operasi yang biasanya dikaitkan dengan count () / empty ()
Menggunakan PHP 5.4.39:
Menggunakan HipHop VM 3.6.1 (dbg)
Kesimpulan jika Anda menggunakan PHP:
empty () jauh lebih cepat daripada count () di kedua skenario, dengan larik kosong dan terisi
count () melakukan hal yang sama dengan array penuh atau kosong.
Melakukan IF sederhana atau hanya operasi Boolean adalah sama.
IF / ELSE sangat sedikit lebih efisien daripada (?:). Kecuali Anda melakukan miliaran iterasi dengan ekspresi di tengah, itu sama sekali tidak signifikan.
Kesimpulan jika Anda menggunakan HHVM:
empty () adalah sedikit lebih cepat daripada count () tetapi tidak begitu signifikan.
[Selebihnya sama seperti di PHP]
Sebagai kesimpulan, jika Anda hanya ingin mengetahui apakah array kosong selalu gunakan empty ();
Ini hanyalah tes aneh yang dilakukan tanpa memperhitungkan banyak hal. Ini hanyalah bukti konsep dan mungkin tidak mencerminkan operasi dalam produksi.
sumber
if($x){
lebih cepat daripadaif(empty($x)){
(hanya berfungsi jika Anda tahu yang$x
telah dinyatakan).count
danempty
panggilan dalam pernyataan if. Kemudian datangempty
dan terakhircount
. Tetapi dibandingkan dengan milik Anda dalam kasus telanjang, yang kosong sepuluh kali lebih cepat! Uji larik sederhana: 0,104662, kosong: 0,177659, hitung: 1,175125 pada PHP 5.6 jika tidak kode Anda memberikan hasil yang sama pada versi ini juga seperti yang Anda sebutkan. Hanya saja itu hasil palsu.Saya pikir itu hanya preferensi pribadi. Beberapa orang mungkin mengatakan
empty
lebih cepat (misalnya http://jamessocol.com/projects/count_vs_empty.php ) sementara yang lain mungkin mengatakancount
lebih baik karena pada awalnya dibuat untuk array.empty
lebih umum dan dapat diterapkan pada jenis lain.php.net memberikan peringatan berikut untuk
count
:Dengan kata lain, jika variabel tidak disetel, Anda akan mendapat pemberitahuan dari PHP yang mengatakan bahwa itu tidak ditentukan. Oleh karena itu, sebelum menggunakan
count
, sebaiknya periksa variabel denganisset
. Ini tidak perlu denganempty
.sumber
count
adalah bahwa itu pada awalnya dibuat untuk array ... namun objek dapat diimplementasikanCountable
, dan Anda dapat meneruskan nilai skalar kecount()
dan mendapatkan hasil yang valid.isset()
itu. Jika Anda khawatir tentang pemberitahuan di PHP, Anda seharusnya sudah mendeklarasikan array Anda. Jika Anda membiarkan PHP secara dinamis mendeklarasikan array Anda, Anda akan mendapatkan pemberitahuan pada saat itu juga. Saya pikir poin sebenarnya dari peringatan di php.net adalah bahwa Anda tidak boleh menggunakancount
untuk menentukan apakah sebuah array telah dideklarasikan atau tidak karena itu menghasilkan hasil yang sama seperti array kosong.Ada, ketika Anda perlu melakukan sesuatu pada array yang tidak kosong dengan mengetahui ukurannya:
Tetapi saya tidak akan merekomendasikan penggunaan hitungan, kecuali Anda 100% yakin, bahwa yang Anda hitung adalah sebuah array. Akhir-akhir ini saya telah men-debug kode, di mana fungsi kesalahan kembali
FALSE
daripada array kosong, dan yang saya temukan adalah:keluaran:
Jadi sejak itu saya menggunakan
empty
atauif(array() === $array)
untuk memastikan bahwa saya memiliki array yang kosong.sumber
count()
tampaknya bekerja lebih baik dengan antarmuka mirip larik yang diterapkanArrayAccess/Countable
.empty()
mengembalikan nilai true untuk jenis objek ini meskipun tidak memiliki elemen. Biasanya kelas-kelas ini akan mengimplementasikanCountable
antarmuka, jadi jika pertanyaannya adalah "Apakah koleksi ini berisi elemen?" tanpa membuat asumsi tentang implementasinya, maka itucount()
adalah pilihan yang lebih baik.sumber
empty
mengembalikan nilai salah untuk jenis objek ini meskipun tidak memiliki elemen"?count
akan menjadi solusi yang lebih fleksibel dan dapat diperluas jika masuk akal bagi kode Anda untuk menerima koleksi yang menerapkan cara "umum" ... IMO yang mungkin menjadi satu-satunya kriteria yang relevan untuk menentukan jika Anda menggunakancount
atau cara lain ...count()
pada 7.2 adalah tidak dapat lagi mengambil variabel kosong.Alternatifnya, Anda dapat mentransmisikan variabel sebagai boolean (secara implisit atau eksplisit):
Metode ini menghasilkan
E_NOTICE
jika variabel tidak ditentukan, mirip dengancount()
.Untuk informasi lebih lanjut, lihat halaman Manual PHP tentang perbandingan tipe .
sumber
empty()
jika Anda secara eksplisit mencoba untuk menghindari pemicuan E_NOTICE (yang umumnya merupakan ide yang buruk, IMO). Penggunaan kosong secara terang-terangan akan menyebabkan kode buggy.Preferensi pribadi saya lebih pada pengkodean keanggunan (dalam kaitannya dengan kasus penggunaan spesifik saya). Saya setuju dengan Dan McG karena count () tidak merespons dengan tipe data yang benar (dalam hal ini boolean) untuk pengujian yang dimaksud yang memaksa pengembang untuk menulis lebih banyak kode untuk mengisi pernyataan 'jika'.
Apakah ini berdampak signifikan pada kinerja hanya dapat diperdebatkan untuk array yang sangat besar (yang mungkin Anda tidak akan memiliki alokasi memori yang cukup untuk bagaimanapun juga di sebagian besar pengaturan).
Khususnya ketika datang ke array $ _POST PHP, tampaknya jauh lebih "logis" menurut saya untuk menulis / melihat:
sumber
Semoga ini bisa membantu seseorang meskipun sudah dijawab (dan diperdebatkan beberapa apa). Dalam skenario saya sendiri, saya tahu semua array saya semua memiliki 7 elemen (pemeriksaan dilakukan sebelumnya dalam kode saya) dan saya melakukan
array_diff
yang tentu saja mengembalikan array nol ketika sama.Saya memiliki 34 detik untuk
count
dan 17 detik untukempty
. Keduanya memberi saya perhitungan yang sama sehingga kode saya masih baik-baik saja.Namun Anda juga dapat mencoba
==
atau===
seperti di PHP - Periksa apakah dua array sama . Yang terbaik yang akan saya katakan adalah cobacount
vsempty
vs== empty array
, lalu lihat mana yang memberikan kinerja terbaik Anda. Dalam kasus sayacount
adalah yang paling lambat jadi saya menggunakanempty
sekarang ... akan memeriksaserialize
berikutnyasumber
Tidak ada alasan yang kuat untuk memilih
count($myArray) == 0
lebihempty($myArray)
. Mereka memiliki semantik yang identik. Beberapa mungkin menemukan satu lebih mudah dibaca daripada yang lain. Satu mungkin berkinerja sedikit lebih baik daripada yang lain tetapi itu tidak mungkin menjadi faktor signifikan dalam sebagian besar aplikasi php. Untuk semua tujuan praktis, pilihannya adalah soal selera.sumber
count
saat Anda perlu menghitung, gunakanempty
saat Anda perlu memeriksa apakah koleksi kosong. Tentu saja ada kasus tepi seperti string atau null, tetapi programmer perlu memikirkan kodenya. Anda mungkin tidak setuju, Anda diizinkan.Terkadang menggunakan kosong adalah suatu keharusan. Contoh kode ini:
Jika Anda menjalankan kode ini seperti ini: http://phpfiddle.org/main/code/g9x-uwi
Anda mendapatkan keluaran ini:
Jadi jika Anda
count
keluaran glob kosong, Anda mendapatkan keluaran yang salah. Anda harus memeriksa kekosongan.Dari dokumentasi glob :
Periksa juga pertanyaan ini: Why count (false) return 1?
sumber
Sejak variabel diuraikan sebagai negatif akan kembali
int(1)
dengancount()
Saya lebih suka
($array === [] || !$array)
menguji array kosong.Ya, kita harus mengharapkan larik kosong, tetapi kita seharusnya tidak mengharapkan implementasi yang baik pada fungsi tanpa tipe kembalian yang dipaksakan.
Contoh dengan
count()
sumber
Saya membuat ulang pikiran saya, terima kasih.
Oke, tidak ada perbedaan antara penggunaan
empty
dancount
. Secara teknis,count
harus digunakan untuk array, danempty
bisa digunakan untuk array serta string. Jadi dalam banyak kasus, mereka dapat dipertukarkan dan jika Anda melihat dokumen php, Anda akan melihat daftar sarancount
jika Anda berada diempty
dan sebaliknya.sumber