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.




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]);
}

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.


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)]);
}

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.


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';
});

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");

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]);
    }

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']);


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.


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


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.


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.


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


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.


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 ..


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;
        }
}

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.


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)]);

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);
?>

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);
                }
            }

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);

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.