Beberapa elemen dalam array saya adalah string kosong berdasarkan apa yang telah dikirimkan pengguna. Saya perlu menghapus elemen-elemen itu. Aku punya ini:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
Tapi itu tidak berhasil. $linksArray
masih memiliki elemen kosong. Saya juga sudah mencoba melakukannya dengan empty()
fungsi, tetapi hasilnya sama.
Jawaban:
Saat Anda berurusan dengan serangkaian string, Anda bisa menggunakan
array_filter()
, yang dengan mudah menangani semua ini untuk Anda:Perlu diingat bahwa jika tidak ada panggilan balik yang diberikan , semua entri array sama dengan
FALSE
(lihat konversi ke boolean ) akan dihapus. Jadi, jika Anda perlu mempertahankan elemen yang merupakan string eksak'0'
, Anda akan membutuhkan panggilan balik khusus:sumber
array_filter
harus menghapus elemen kosong. Dan jika definisi kosong PHP tidak sama dengan definisi Anda, maka Anda dapat mengisi opsi panggilan balik dengan fungsi anonim yang membuang elemen yang tidak diinginkan. Rupanya Anda harus memiliki php 5.3 atau yang lebih baru untuk menggunakan punggung panggilan anonim. stackoverflow.com/questions/2412299/…false
elemen juga. ( php.net/manual/en/function.array-filter.php )a
kedua kalinya hanya mengatur ulang yang pertama.Anda dapat menggunakan
array_filter
untuk menghapus elemen kosong:Jika ada
(int) 0
dalam array Anda, Anda dapat menggunakan yang berikut:EDIT: Mungkin elemen Anda tidak kosong tetapi hanya mengandung satu atau lebih spasi ... Anda dapat menggunakan yang berikut sebelum menggunakan
array_filter
sumber
scalar
item dalam array Anda, ya. Kalau tidak, Anda tidak bisa melakukan itu.function remove_empty($array) { return array_filter($array, function($value){return !empty($value) || $value === 0;}); }
array_map()
lakukan keajaiban karena aku punya ruang di array kosong itu!Jawaban paling populer tentang topik ini benar-benar TIDAK BENAR.
Pertimbangkan skrip PHP berikut:
Kenapa ini? Karena string yang berisi karakter '0' tunggal juga mengevaluasi ke boolean false, jadi meskipun itu bukan string kosong, itu masih akan disaring. Itu akan menjadi bug.
Melewati fungsi strlen bawaan sebagai fungsi filter akan berfungsi, karena mengembalikan integer non-nol untuk string yang tidak kosong, dan integer nol untuk string kosong. Bilangan bulat nol selalu menilai true ketika dikonversi ke boolean, sedangkan bilangan bulat nol selalu bernilai false ketika dikonversi ke boolean.
Jadi, jawaban absolut, pasti, dan benar adalah:
sumber
0
,""
,null
)strlen() expects parameter 1 to be string, array given
"Jika tidak ada callback yang diberikan, semua entri input yang sama dengan FALSE akan dihapus." - http://php.net/manual/en/function.array-filter.php
sumber
sumber
Anda bisa melakukannya
array_filter: "Jika tidak ada panggilan balik yang diberikan, semua entri input yang sama dengan FALSE akan dihapus." Ini berarti bahwa elemen dengan nilai NULL, 0, '0', '', FALSE, array () akan dihapus juga.
Pilihan lainnya adalah melakukan
yang akan menghapus elemen dengan nilai NULL, '' dan FALSE.
Semoga ini membantu :)
MEMPERBARUI
Berikut ini sebuah contoh.
Untuk menyimpulkan:
sumber
sumber
false
dan0
. Mengingat ini telah diposting pada menit yang sama dengan jawaban yang diterima (yang tidak aman dan salah), saya hanya dapat berasumsi 8 upvotes Anda dibandingkan dengan jawaban yang diterima 649 turun ke yang terakhir menjadi solusi satu baris.array_filter()
menjadi pendekatan yang lebih bersih daripadaforeach()
looptrim()
, saya akan merekomendasikanif(is_string($link) && trim($link) === '')
Satu liner lain untuk menghapus elemen kosong ("string kosong) dari array Anda.
Catatan: Kode ini sengaja disimpan
null
,0
danfalse
elemen.Atau mungkin Anda ingin memotong elemen array Anda terlebih dahulu:
Catatan: Kode ini juga menghapus
null
danfalse
elemen.sumber
Pendeknya:
Ini adalah kode yang saya sarankan:
Penjelasan:
Saya pikir penggunaan
array_filter
itu baik, tetapi tidak cukup, karena nilainya sepertispace
dan\n
, ... simpan dalam array dan ini biasanya buruk.Jadi saya sarankan Anda menggunakan campuran
array_filter
danarray_map
.array_map
adalah untuk memotong,array_filter
untuk menghapus nilai kosong,strlen
untuk menyimpan0
nilai, danarray_values
untuk pengindeksan ulang jika Anda perlu.Sampel:
Hasil:
Tes Online:
http://phpio.net/s/5yg0
sumber
Jika Anda bekerja dengan array numerik dan perlu mengindeks ulang array setelah menghapus elemen kosong, gunakan fungsi array_values :
Juga lihat: array PHP reindex?
sumber
Jawaban yang paling banyak dipilih salah atau setidaknya tidak sepenuhnya benar karena OP hanya berbicara tentang string kosong. Berikut penjelasan lengkapnya:
Apa artinya kosong ?
Pertama-tama, kita harus sepakat tentang arti kosong . Maksud Anda menyaring:
$element === false
)empty()
fungsi PHP ?Bagaimana Anda memfilter nilai
Untuk memfilter hanya string kosong :
Untuk hanya memfilter nilai yang sepenuhnya salah , Anda harus menggunakan fungsi callback :
Panggilan balik ini juga berguna untuk kombinasi apa pun di mana Anda ingin memfilter nilai "falsey", kecuali beberapa. (Misalnya, filter setiap
null
danfalse
, dll, hanya menyisakan0
):Kasus ketiga dan keempat setara (untuk tujuan kami pada akhirnya), dan untuk itu yang harus Anda gunakan adalah default:
sumber
null
danfalse
, tetapi meninggalkan 0, Anda juga dapat menggunakanstrlen
fungsi built-in php sebagai panggilan balik Anda.Saya harus melakukan ini untuk menjaga nilai array (string) 0
sumber
sumber
Untuk array multidimensi
sumber
sumber
sumber
Saya menggunakan skrip berikut untuk menghapus elemen kosong dari array
sumber
Hanya ingin berkontribusi alternatif untuk loop ... juga mengatasi celah kunci ...
Dalam kasus saya, saya ingin menyimpan kunci array berurutan ketika operasi selesai (bukan hanya angka ganjil, yang saya tatap. Menyiapkan kode untuk mencari kunci aneh tampak rapuh bagi saya dan tidak ramah untuk masa depan.)
Saya mencari sesuatu yang lebih seperti ini: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/
Kombinasi dari array_filter dan array_slice berhasil.
$example = array_filter($example); $example = array_slice($example,0);
Tidak tahu efisiensi atau tolok ukur tetapi itu berhasil.
sumber
keluaran
sumber
sumber
Hanya satu baris: Perbarui (terima kasih kepada @suther):
sumber
gunakan
array_filter
fungsi untuk menghapus nilai kosong:sumber
Hapus elemen array kosong
berhasil!
sumber
Sesuai metode Anda, Anda bisa menangkap elemen-elemen itu di array lain dan menggunakannya seperti berikut,
sumber
coba ini ** ** Contoh
sumber
Saya pikir array_walk jauh lebih cocok di sini
Keluaran:
Kami juga memangkas ruang kosong dari nilai yang valid
Akhirnya, hanya (null), (Boolean False) dan ('') akan dianggap sebagai string kosong
Adapun
False
tidak masalah untuk menghapusnya, karena AFAIK pengguna tidak dapat mengirimkan nilai boolean.sumber
Dengan hal-hal semacam ini, jauh lebih baik untuk bersikap eksplisit tentang apa yang Anda inginkan dan tidak inginkan.
Ini akan membantu orang berikutnya untuk tidak terkejut dengan perilaku
array_filter()
tanpa panggilan balik. Misalnya, saya berakhir dengan pertanyaan ini karena saya lupa apakaharray_filter()
menghapusNULL
atau tidak. Saya membuang-buang waktu ketika saya bisa saja menggunakan solusi di bawah ini dan mendapatkan jawaban saya.Juga, logikanya adalah bahasa angnostik dalam arti bahwa kode dapat disalin ke bahasa lain tanpa harus memahami perilaku fungsi php seperti
array_filter
ketika tidak ada panggilan balik yang dilewatkan.Dalam solusi saya, jelas sekali apa yang terjadi. Hapus persyaratan untuk menyimpan sesuatu atau menambahkan kondisi baru untuk memfilter nilai tambahan.
Abaikan penggunaan sebenarnya
array_filter()
karena saya baru saja menyampaikannya sebagai panggilan balik kustom - Anda bisa melanjutkan dan mengekstraknya ke fungsinya sendiri jika Anda mau. Saya hanya menggunakannya sebagai gula untuk satuforeach
putaran.Manfaat lain dari pendekatan ini adalah Anda dapat memecah predikat pemfilteran menjadi fungsi abstrak yang memfilter nilai tunggal per larik dan membangun solusi komposabel.
Lihat contoh ini dan komentar sebaris untuk hasilnya.
Sekarang Anda dapat secara dinamis membuat fungsi yang disebut
filterer()
usingpipe()
yang akan menerapkan fungsi-fungsi yang diterapkan sebagian ini untuk Anda.sumber