Saya memiliki array PHP sebagai berikut:
$messages = [312, 401, 1599, 3, ...];
Saya ingin menghapus elemen yang mengandung nilai $del_val
(misalnya, $del_val=401
), tetapi saya tidak tahu kuncinya. Ini mungkin membantu: setiap nilai hanya dapat berada di sana satu kali .
Saya mencari fungsi paling sederhana untuk melakukan tugas ini.
Jawaban:
Menggunakan
array_search()
danunset
, coba yang berikut ini:array_search()
mengembalikan kunci elemen yang ditemukannya, yang dapat digunakan untuk menghapus elemen itu dari array asli menggunakanunset()
. Ini akan kembaliFALSE
pada kegagalan, namun itu dapat mengembalikan nilai false-y pada kesuksesan (kunci Anda mungkin0
misalnya), itulah mengapa!==
operator perbandingan ketat digunakan.The
if()
pernyataan akan memeriksa apakaharray_search()
kembali nilai, dan hanya akan melakukan tindakan jika hal itu.sumber
array_diff()
akan lebih lambat karena membandingkan dua array, bukan hanya mencari melalui satu sepertiarray_search()
.$key
itu0
?0
atau nilai falsey lainnya, itu tidak akan membatalkan nilai dan kode Anda tidak akan berfungsi. Anda harus menguji$key === false
. (edit - Anda mendapatkannya)Nah, menghapus elemen dari array pada dasarnya hanya mengatur perbedaan dengan satu elemen.
Ini menggeneralisasi dengan baik, Anda dapat menghapus elemen sebanyak yang Anda suka pada saat yang sama, jika Anda mau.
Penafian: Perhatikan bahwa solusi saya menghasilkan salinan array yang baru sambil mempertahankan yang lama berbeda dengan jawaban yang diterima yang bermutasi. Pilih yang Anda butuhkan.
sumber
[$element]
, saya menggunakanarray($element)
sebagai gantinya. Bukan masalah besar, tetapi hanya ingin siapa pun yang memiliki masalah serupa mengetahui bahwa mereka tidak sendirianarray_diff
digunakan(string) $elem1 === (string) $elem2
sebagai kondisi kesetaraannya, bukan$elem1 === $elem2
seperti yang Anda harapkan. Masalah yang ditunjukkan oleh @ nischayn22 adalah konsekuensi dari ini. Jika Anda ingin sesuatu digunakan sebagai fungsi utilitas yang akan berfungsi untuk array elemen arbitrer (yang mungkin objek), jawaban Bojangle mungkin lebih baik karena alasan ini.array_diff()
dan karenanya mendorong runtime hingga O (n lg n) dari O (n).Salah satu cara yang menarik adalah dengan menggunakan
array_keys()
:The
array_keys()
Fungsi membutuhkan dua parameter tambahan untuk kembali hanya kunci untuk nilai tertentu dan apakah pemeriksaan yang ketat diperlukan (yaitu menggunakan === untuk perbandingan).Ini juga dapat menghapus beberapa item array dengan nilai yang sama (misalnya
[1, 2, 3, 3, 4]
).sumber
array_values()
juga; kunci yang tersisa masih dalam urutan yang sama, jadi secara teknis itu bukan "tidak disortir"Jika Anda tahu pasti bahwa array Anda hanya akan berisi satu elemen dengan nilai itu, Anda bisa melakukannya
Namun, jika nilai Anda mungkin muncul lebih dari satu kali dalam array Anda, Anda bisa melakukan ini
Catatan: Opsi kedua hanya berfungsi untuk PHP5.3 + dengan Penutupan
sumber
sumber
Lihatlah kode berikut:
Anda dapat melakukan:
Dan itu akan memberi Anda array ini:
sumber
Cara terbaik adalah
array_splice
Alasan Terbaik ada di sini di http://www.programmerinterview.com/index.php/php-questions/how-to-delete-an-element-from-an-array-in-php/
sumber
[1, 2, 4 => 3]
.3
, array akan menjadi[1, 2, 3]
; dengan kata lain, nilainya tidak dihapus. Untuk lebih jelasnya, saya tidak mengatakan itu gagal di semua skenario, hanya yang ini.Atau sederhananya, cara manual:
Ini adalah yang paling aman dari mereka karena Anda memiliki kontrol penuh pada array Anda
sumber
array_splice()
bukannyaunset()
akan menyusun ulang indeks array juga, yang bisa lebih baik dalam hal ini.Dengan kode berikut, nilai berulang akan dihapus dari $ messages.
$messages = array_diff($messages, array(401));
sumber
Jika Anda memiliki PHP
5.3+
, ada kode satu baris:sumber
$value
, jadi itu benar-benar harus dimasukkan ke dalam kelas mini sehingga Anda dapat mengakses$value
dalam penutupan ....Keluaran
Array ( [0] => 312 [1] => 1599 [2] => 3 )
sumber
Anda dapat melakukan:
Penjelasan : Hapus elemen yang memiliki kunci
401
setelah membalik array.sumber
401
?Untuk menghapus beberapa nilai, coba yang ini:
sumber
Meminjam logika underscore.JS _.reject dan membuat dua fungsi (orang lebih suka fungsi !!)
array_reject_value: Fungsi ini hanya menolak nilai yang ditentukan (juga berfungsi untuk PHP4,5,7)
array_reject: Fungsi ini hanya menolak metode yang dapat dipanggil (berfungsi untuk PHP> = 5.3)
Jadi, dalam contoh kita saat ini, kita dapat menggunakan fungsi di atas sebagai berikut:
atau bahkan lebih baik: (karena ini memberi kita sintaks yang lebih baik untuk digunakan seperti array_filter )
Di atas dapat digunakan untuk hal-hal yang lebih rumit seperti katakanlah kami ingin menghapus semua nilai yang lebih besar atau sama dengan 401, kami cukup melakukan ini:
sumber
Coba ini, Ini adalah cara terbaik dan tercepat untuk menghapus elemen berdasarkan nilai
sumber
@Bangang jawaban membantu saya. Terima kasih.
Dalam kasus saya, array bisa asosiatif atau tidak, jadi saya menambahkan fungsi berikut
Salam
sumber
kode single liner (terima kasih kepada array_diff () ), gunakan yang berikut:
sumber
Jawaban yang diterima mengubah array menjadi array asosiatif, jadi, jika Anda ingin menjadikannya sebagai array non-asosiatif dengan jawaban yang diterima, Anda mungkin harus menggunakan
array_values
juga.Referensi ada di sini
sumber
Sesuai kebutuhan Anda, " setiap nilai hanya dapat berada di sana untuk sekali " jika Anda hanya tertarik untuk menjaga nilai-nilai unik dalam array Anda, maka
array_unique()
mungkin apa yang Anda cari.Memasukkan:
Hasil:
sumber
Jika nilai yang ingin Anda hapus adalah, atau bisa, berada dalam array. Gunakan fungsi array_diff . Tampaknya bekerja dengan baik untuk hal-hal seperti ini.
array_diff
sumber
Saya tahu ini tidak efisien sama sekali tetapi sederhana, intuitif dan mudah dibaca.
Jadi jika seseorang mencari solusi yang tidak terlalu mewah yang dapat diperluas untuk bekerja dengan lebih banyak nilai, atau kondisi yang lebih spesifik .. di sini adalah kode sederhana:
sumber
Dapatkan kunci array dengan
array_search()
.sumber
Jika Anda tidak tahu kuncinya, itu berarti tidak masalah.
Anda bisa menempatkan nilai sebagai kuncinya, itu berarti akan langsung menemukan nilainya. Lebih baik daripada menggunakan pencarian di semua elemen berulang-ulang.
sumber
Satu liner menggunakan
or
operator:sumber
Anda dapat merujuk URL ini : untuk fungsi
Maka output harus,
sumber
Gagasan lain untuk menghapus nilai array, gunakan array_diff. Jika saya mau
(Doc: http://php.net/manual/fr/function.array-diff.php )
sumber
Saya pikir cara paling sederhana adalah dengan menggunakan fungsi dengan foreach loop:
Output akan menjadi:
sumber
Dengan PHP 7.4 menggunakan fungsi panah:
Untuk membuatnya array non-asosiatif membungkusnya dengan
array_values()
:sumber