PHP: Bagaimana menghapus elemen tertentu dari array?

159

Bagaimana cara menghapus elemen dari array ketika saya tahu nama elemen? sebagai contoh:

Saya memiliki sebuah array:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

pengguna masuk strawberry

strawberry dihapus.

Untuk sepenuhnya menjelaskan:

Saya memiliki database yang menyimpan daftar item yang dipisahkan oleh koma. Kode menarik dalam daftar berdasarkan pilihan pengguna di mana pilihan itu berada. Jadi, jika mereka memilih stroberi, mereka menarik kode di setiap entri jika stroberi berada kemudian mengubahnya menjadi array menggunakan split (). Saya ingin mereka menghapus item yang dipilih pengguna, untuk strawberry contoh ini, dari array.

dcp3450
sumber
4
Pertanyaan yang sama: stackoverflow.com/questions/7225070/…
trante
1
Pertanyaan lain yang sama: stackoverflow.com/questions/1883421/…
Eric Lavoie
1
pertanyaan yang lebih sama: stackoverflow.com/questions/369602/…
Alex

Jawaban:

295

Gunakan array_searchuntuk mendapatkan kunci dan menghapusnya unsetjika ditemukan:

if (($key = array_search('strawberry', $array)) !== false) {
    unset($array[$key]);
}

array_searchmengembalikan false ( null hingga PHP 4.2.0) jika tidak ada item yang ditemukan.

Dan jika ada beberapa item dengan nilai yang sama, Anda dapat menggunakannya array_keys untuk mendapatkan kunci untuk semua item:

foreach (array_keys($array, 'strawberry') as $key) {
    unset($array[$key]);
}
Gumbo
sumber
Mendapatkan hasil yang aneh. Saya menggunakan saran pertama Anda karena selalu akan hanya ada satu contoh. Untuk mengujinya, saya cukup mengeluarkan nilai kunci. Bekerja. Namun, itu tidak akan disetel.
dcp3450
1
while (odbc_fetch_row ($ runqueryGetSubmenus)) {$ submenuList = odbc_result ($ runqueryGetSubmenus, "submenus"); $ submenuArray = split (',', $ submenuList); if (($ key = array_search ($ name, $ submenuArray))! == false) {unset ($ submenuArray [$ key]); }}
dcp3450
@ dcp3450: Dan apa yang Anda lakukan $submenuArray? (Perhatikan bahwa dengan setiap loop $submenuArrayakan ditimpa.)
Gumbo
saya memperbarui pertanyaan saya untuk lebih menjelaskan. Pada dasarnya, kode ini di-loop melalui entri dalam database dengan menghapus item yang dipilih, "strawberry" dalam contoh ini. Jadi, pengguna memasukkan pilihan => pencarian kode di bawah submenu dan menemukan daftar yang memiliki opsi itu => mengubah daftar itu menjadi sebuah array => menghapus opsi yang dipilih.
dcp3450
1
Saya mendapatkannya! Saya tidak menulis ulang array baru kembali ke DB. Mudah ketinggalan barang ketika Anda menatap kode begitu lama.
dcp3450
153

Gunakan array_diff()untuk 1 solusi garis:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi', 'strawberry'); //throw in another 'strawberry' to demonstrate that it removes multiple instances of the string
$array_without_strawberries = array_diff($array, array('strawberry'));
print_r($array_without_strawberries);

... Tidak perlu fungsi tambahan atau foreach loop.

penyakit
sumber
8
Solusi ini jauh lebih mudah dibaca daripada yang teratas.
Robbert
Meskipun jika strawberrytidak ada dalam array awal, array akan tersedia dalam $array_without_strawberrieskode - berbahaya jika Anda ingin memastikan bahwa elemen yang diberikan tidak ada dalam array.
Erfan
5
@Erfan Klaim Anda salah. $a = array_diff(array(), array('strawberry'));- $ a adalah array kosong.
bancer
1
Anda benar @ penari - Saya mungkin berpikir tentang array_intersect atau sesuatu.
Erfan
1
array_diff () lebih elegan daripada jawaban yang ditandai.
Dom DaFonte
36
if (in_array('strawberry', $array)) 
{
    unset($array[array_search('strawberry',$array)]);
}
John Conde
sumber
2
Anda harus menguji apakah strawberry ada dalam array sama sekali.
Gumbo
Mengikuti saran Gumbo, jawaban yang dimodifikasi untuk menyertakan verifikasi elemen sebelum menghapusnya dari array.
John Conde
2
Perlu diingat juga bahwa indeks tidak disesuaikan setelah menghapus elemen tertentu. Dengan kata lain, urutan indeks akan memiliki celah kemudian. Jika Anda menghapus 'strawberry' dari contoh Anda, 'kiwi' masih akan memiliki indeks 4, dan indeks 2 akan hilang begitu saja. Itu penting jika kode Anda bergantung pada kelengkapan urutan indeks, seperti misalnya untuk loop ($ i = 0; $ i <.., $ i ++) lakukan.
the-banana-king
2
Untuk menambahkan apa yang dikatakan raja-pisang, jika Anda ingin memasukkan kembali array, cukup lakukan $my_array = array_values($my_array);.
ryeguy
2
Sementara solusi ini benar, ia mencari array DUA KALI ( in_arraydan array_search). Menggunakan kembalinya array_searchseperti dalam jawaban Gumbo lebih efektif
Bogdan D
21

Jika Anda menggunakan array biasa di sini (yang terlihat seperti kasing), Anda harus menggunakan kode ini sebagai gantinya:

if (($key = array_search('strawberry', $array)) !== false) {
    array_splice($array, $key, 1);
}

unset($array[$key]) hanya menghilangkan elemen tetapi tidak menyusun ulang susunan polos.

Sepertinya kita memiliki sebuah array dan menggunakan array_splice:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
array_splice($array, 2, 1);
json_encode($array); 
// yields the array ['apple', 'orange', 'blueberry', 'kiwi']

Dibandingkan dengan tidak disetel:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[2]);
json_encode($array);
// yields an object {"0": "apple", "1": "orange", "3": "blueberry", "4": "kiwi"}

Perhatikan bagaimana unset($array[$key])tidak menyusun ulang susunan.

ericluwj
sumber
Secara resmi unsettidak mengembalikan apa pun. Jadi json_encode(unset($array[2]))tidak tepat untuk perbandingan.
robsch
ini persis apa yang saya butuhkan, terima kasih kepada ericluwj
ana
12

Anda dapat menggunakan filter array untuk menghapus item dengan kondisi tertentu pada $v:

$arr = array_filter($arr, function($v){
    return $v != 'some_value';
});
srcspider
sumber
Downvote. Ini berkualitas rendah (karena itu adalah jawaban hanya kode dan memberikan kesalahan parsing) adalah duplikat dari metode D.Martin yang hanya menggunakan fungsi anonim di dalamnya array_filter(). Walaupun saya secara pribadi akan menggunakan fungsi anonim dalam implementasi saya, saya percaya tindakan yang benar pada SO adalah mengomentari atau mengedit jawaban D.Martin jika Anda ingin melakukan perbaikan mikro sehingga halaman ini tidak menjadi kembung. Hapus jawaban duplikat ini.
mickmackusa
4

Akan seperti ini:

 function rmv_val($var)
 {
     return(!($var == 'strawberry'));
 }

 $array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');

 $array_res = array_filter($array, "rmv_val");
D.Martin
sumber
4

Ini adalah pengulangan sederhana yang dapat menghapus beberapa nilai dalam array.

    // Your array
    $list = array("apple", "orange", "strawberry", "lemon", "banana");

    // Initilize what to delete
    $delete_val = array("orange", "lemon", "banana");

    // Search for the array key and unset   
    foreach($delete_val as $key){
        $keyToDelete = array_search($key, $list);
        unset($list[$keyToDelete]);
    }
mmr
sumber
Ini adalah pengganti yang tidak efisien dan telah diluncurkan untuk apa yang telah dibuat oleh pengembang PHP array_diff(). Bagaimana ini bisa mendapatkan tiga upvotes. Tidak seorang pun seharusnya menemukan jawaban ini bermanfaat atau menggunakannya dalam proyek mereka sendiri. Saya sarankan menghapus jawaban ini - ini akan berfungsi untuk membebaskan akun Anda dari jawaban berkualitas rendah, mengurangi jawaban-gembung pada halaman ini, dan memberi Anda lencana disiplin. Saya akan menunda downvote saya sehingga Anda punya waktu untuk menghapus hadiah.
mickmackusa
4

Hanya kamu dapat melakukan satu baris. Itu akan menghapus elemen dari array


$array=array_diff($array,['strawberry']);

dılo sürücü
sumber
3

Saat ini saya menggunakan fungsi ini:

function array_delete($del_val, $array) {
    if(is_array($del_val)) {
         foreach ($del_val as $del_key => $del_value) {
            foreach ($array as $key => $value){
                if ($value == $del_value) {
                    unset($array[$key]);
                }
            }
        }
    } else {
        foreach ($array as $key => $value){
            if ($value == $del_val) {
                unset($array[$key]);
            }
        }
    }
    return array_values($array);
}

Anda dapat memasukkan array atau hanya string dengan elemen yang harus dihapus. Tulis seperti ini:

$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$detils = array_delete(array('orange', 'apple'), $detils);

ATAU

$detils = array_delete('orange', $detils);

Itu juga akan mengindeks ulang.

jankal
sumber
2
Ini sangat berbelit-belit dan gila. Bagaimana hal ini mendapatkan 3 upvotes?!?
mickmackusa
2

Pertanyaan ini memiliki beberapa jawaban tetapi saya ingin menambahkan sesuatu lebih karena ketika saya menggunakan unsetatauarray_diff saya memiliki beberapa masalah untuk bermain dengan indeks array baru ketika elemen tertentu dihapus (karena indeks awal disimpan)

Saya kembali ke contoh:

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
$array_without_strawberries = array_diff($array, array('strawberry'));

atau

$array = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
unset($array[array_search('strawberry', $array)]);

Jika Anda mencetak hasilnya, Anda akan mendapatkan:

foreach ($array_without_strawberries as $data) {
   print_r($data);
}

Hasil:

> apple
> orange
> blueberry
> kiwi

Tetapi indeks akan disimpan dan Anda akan mengakses elemen Anda seperti:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[3] > blueberry
$array_without_strawberries[4] > kiwi

Dan array terakhir tidak diindeks ulang. Jadi, Anda perlu menambahkan setelah unsetatau array_diff:

$array_without_strawberries = array_values($array);

Setelah itu array Anda akan memiliki indeks normal:

$array_without_strawberries[0] > apple
$array_without_strawberries[1] > orange
$array_without_strawberries[2] > blueberry
$array_without_strawberries[3] > kiwi

Terkait dengan posting ini: Re-Index Array

masukkan deskripsi gambar di sini

Semoga ini bisa membantu

Jordan Montel
sumber
1

Pendekatan yang lebih baik mungkin untuk menjaga nilai-nilai Anda sebagai kunci dalam array asosiatif, dan kemudian memanggilnya array_keys()ketika Anda ingin array aktual. Dengan begitu Anda tidak perlu menggunakan array_searchuntuk menemukan elemen Anda.

jishi
sumber
1
Posting Anda adalah komentar bukan jawaban. Harap hapus dan poskan di bawah pertanyaan itu sendiri.
mickmackusa
1

Jawaban untuk array PHP dihapus dengan nilai (bukan kunci) Diberikan oleh https://stackoverflow.com/users/924109/rok-kralj

IMO adalah jawaban terbaik karena menghilangkan dan tidak bermutasi

array_diff( [312, 401, 15, 401, 3], [401] ) // removing 401 returns [312, 15, 3]

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. Mungkin sedikit lebih lambat karena ini.

diburu
sumber
1

Saya mencari jawaban untuk pertanyaan yang sama dan menemukan topik ini. Saya melihat dua cara utama: kombinasi array_search& unsetdan penggunaan array_diff. Sekilas, menurut saya metode pertama akan lebih cepat, karena tidak memerlukan penciptaan array tambahan (seperti saat menggunakan array_diff). Tetapi saya menulis patokan kecil dan memastikan bahwa metode kedua tidak hanya lebih ringkas, tetapi juga lebih cepat! Senang berbagi ini dengan Anda. :)

https://glot.io/snippets/f6ow6biaol

ПЭХАПЭШНИК
sumber
0

Saya lebih suka menggunakan array_key_exists untuk mencari kunci dalam array seperti:

Array([0]=>'A',[1]=>'B',['key'=>'value'])

untuk menemukan yang ditentukan secara efektif, karena array_search dan in_array () tidak berfungsi di sini. Dan jangan menghapus barang dengan tidak disetel () .

Saya pikir itu akan membantu seseorang.

ddsultan
sumber
0

Buat array numerik dengan menghapus nilai Array tertentu

    <?php
    // create a "numeric" array
    $animals = array('monitor', 'cpu', 'mouse', 'ram', 'wifi', 'usb', 'pendrive');

    //Normarl display
    print_r($animals);
    echo "<br/><br/>";

    //If splice the array
    //array_splice($animals, 2, 2);
    unset($animals[3]); // you can unset the particular value
    print_r($animals);

    ?>

Anda Dapat Merujuk tautan ini ..

Sashtha Manik
sumber
Downvote. Pertanyaannya dengan jelas meminta untuk menghapus nilai berdasarkan nilai (bukan kunci). Jawaban ini tidak berguna, harap hapus.
mickmackusa
0
$remove= "strawberry";
$array = ["apple", "orange", "strawberry", "blueberry", "kiwi"];
foreach ($array as $key => $value) {
        if ($value!=$remove) {
        echo $value.'<br/>';
                continue;
        }
}
Krishna Jonnalagadda
sumber
Jawaban ini bahkan tidak menghapus opsi yang diperlukan.
Nigel Ren
-1

Menggunakan array_seach(), coba yang berikut ini:

if(($key = array_search($del_val, $messages)) !== false) {
    unset($messages[$key]);
}

array_search()mengembalikan kunci elemen yang ditemukannya, yang dapat digunakan untuk menghapus elemen itu dari array asli menggunakan unset(). Ini akan kembali FALSEpada kegagalan, namun itu dapat mengembalikan nilai "falsey" pada kesuksesan (kunci Anda mungkin 0misalnya), itulah sebabnya mengapa !==operator perbandingan ketat digunakan.

The if()pernyataan akan memeriksa apakah array_search()kembali nilai, dan hanya akan melakukan tindakan jika hal itu.

Ravinder Singh
sumber
3
Downvote. Ini duplikat metode Gumbo (saat ini solusi yang diterima) yang diposting bertahun-tahun sebelum Anda. Jawaban duplikat tidak memiliki nilai dan hanya menyebabkan penggembungan halaman yang tidak perlu. Harap hapus jawaban Anda. Jika Anda ingin menjelaskan jawaban Gumbo, lakukan dengan edit pada jawabannya atau minta Gumbo untuk memperluas jawabannya sendiri
mickmackusa
-1
unset($array[array_search('strawberry', $array)]);
maks li
sumber
2
Downvote. The array_search()-unset() Metode itu sudah diposting oleh John Conde tahun sebelum Anda. Jawaban duplikat tidak memiliki nilai bagi pembaca dan sebenarnya merupakan ketidaknyamanan karena waktu yang terbuang saat menggulir dan membaca informasi yang berlebihan. Silakan hapus jawaban ini.
mickmackusa
-1
<?php 
$array = array("apple", "orange", "strawberry", "blueberry", "kiwi");
$delete = "strawberry";
$index = array_search($delete, $array);
array_splice($array, $index, 1);
var_dump($array);
?>
Onome Mine Adamu
sumber
2
Anda dapat meningkatkan jawaban ini dengan menulis satu atau dua kalimat tentang a) apa yang dilakukan kode, dan b) mengapa menurut Anda itu pilihan di antara semua jawaban lainnya.
Robin Mackenzie
-1
foreach ($get_dept as $key5 => $dept_value) {
                if ($request->role_id == 5 || $request->role_id == 6){
                    array_splice($get_dept, $key5, 1);
                }
            }
Rajendra Rajput
sumber
4
Selain jawaban yang Anda berikan, silakan pertimbangkan untuk memberikan penjelasan singkat tentang mengapa dan bagaimana ini memperbaiki masalah.
jtate
-2
$detils = array('apple', 'orange', 'strawberry', 'blueberry', 'kiwi');
     function remove_embpty($values)
     {
        if($values=='orange')
        {
            $values='any name';
        }
        return $values;
     }
     $detils=array_map('remove_embpty',$detils);
    print_r($detils);
pengguna3296940
sumber
2
Silakan juga tambahkan penjelasan. Bagaimana itu memecahkan masalah.
Rahil Wazir
jawaban Anda ganti satu elemen array ke yang lain TIDAK untuk menghapus elemen
ahmed hamdy
Downvote. Jawaban ini tidak memberikan hasil yang diharapkan. Harap hapus jawaban yang salah ini.
mickmackusa