Bagaimana cara menghapus objek dari array di dalam foreach loop?


140

Saya beralih melalui array objek dan ingin menghapus salah satu objek berdasarkan properti 'id', tetapi kode saya tidak berfungsi.

foreach($array as $element) {
    foreach($element as $key => $value) {
        if($key == 'id' && $value == 'searched_value'){
            //delete this particular object from the $array
            unset($element);//this doesn't work
            unset($array,$element);//neither does this
        } 
    }
}

Ada saran. Terima kasih.


Jawaban:


233
foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        if($valueKey == 'id' && $value == 'searched_value'){
            //delete this particular object from the $array
            unset($array[$elementKey]);
        } 
    }
}

62
Apakah aman untuk menghapus elemen array dalam loop foreach dari array yang sama?
Olivier Pons

25
@Liver: biasanya akan menghasilkan perilaku yang tidak terduga, tetapi Anda dapat melakukannya dengan aman dengan foreach di php. Berikan baca di sini untuk ujian: php.net/manual/en/control-structures.foreach.php#88578
pangon

1
@ Paritosh Saya tahu Anda memposting ini sejak lama, tapi itu karena PHP menggunakan array asosiatif. Jadi Anda memiliki indeks yang dihapus: dan itu disandikan ke JSON sebagai Obyek. Masuk akal, karena array asosiatif adalah "kamus." Mungkin bisa membantu seseorang yang datang.
Ryan O'Donnell

1
Apakah Anda benar-benar perlu melakukan yang kedua untuk masing-masing? tidak bisakah Anda hanya menanyakan properti 'id' yang diinginkan dari objek? Mengapa memeriksa semua alat peraga lainnya.
htafoya

3
@htafoya tidak, Anda hanya bisa melakukan if(isset($element['id']) && $element['id'] == 'searched_value') { unset($array[$elementKey]); }Saya pikir pada saat itu saya hanya menyalin dan memodifikasi kodenya untuk menunjukkan kepadanya bagaimana cara yang unsetbenar.
prodigitalson

2

Sepertinya sintaks Anda untuk tidak disetel tidak valid, dan kurangnya pengindeksan ulang dapat menyebabkan masalah di masa mendatang. Lihat: bagian pada array PHP .

Sintaks yang benar ditunjukkan di atas. Ingat juga nilai array untuk pengindeksan ulang, sehingga Anda tidak pernah mengindeks sesuatu yang sebelumnya Anda hapus.


2

Anda juga dapat menggunakan referensi pada foreachnilai-nilai:

foreach($array as $elementKey => &$element) {
    // $element is the same than &$array[$elementKey]
    if (isset($element['id']) and $element['id'] == 'searched_value') {
        unset($element);
    }
}

9
$ element (digunakan masuk dan keluar dari foreach) hanyalah referensi ke setiap elemen dalam array. unset ($ element) hanya akan memecah referensi, itu tidak menghancurkan elemen yang direferensikan dari arraynya.
Nicholas

3
@Dev_NIX $element = nullTIDAK akan berfungsi, panjangnya $arraytetap sama, itu hanya akan mengandung nulls
Nico Westerdale

1

Ini harus melakukan triknya .....

reset($array);
while (list($elementKey, $element) = each($array)) {
    while (list($key, $value2) = each($element)) {
        if($key == 'id' && $value == 'searched_value') {
            unset($array[$elementKey]);
        }
    }
}

1

Hati-hati dengan jawaban utama.

dengan

[['id'=>1,'cat'=>'vip']
,['id'=>2,'cat'=>'vip']
,['id'=>3,'cat'=>'normal']

dan memanggil fungsi

foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        if($valueKey == 'cat' && $value == 'vip'){
            //delete this particular object from the $array
            unset($array[$elementKey]);
        } 
    }
}

ia kembali

[2=>['id'=>3,'cat'=>'normal']

dari pada

[0=>['id'=>3,'cat'=>'normal']

Itu karena unset tidak mengindeks ulang array.

Itu mengindeks ulang. (jika kita membutuhkannya)

$result=[];
foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        $found=false;
        if($valueKey === 'cat' && $value === 'vip'){
            $found=true;
            $break;
        } 
        if(!$found) {
           $result[]=$element;
        }
    }
}

0

Saya tidak banyak programmer PHP, tapi saya bisa mengatakan bahwa dalam C # Anda tidak dapat mengubah array saat iterasi melalui itu. Anda mungkin ingin mencoba menggunakan foreach loop Anda untuk mengidentifikasi indeks elemen, atau elemen untuk menghapus, lalu hapus elemen setelah loop.


14
Walaupun ini merupakan praktik yang buruk di sebagian besar bahasa, array pada PHP pada dasarnya adalah array asosiatif yang dapat diulang secara berurutan. Menghapus elemen sebelumnya tidak mengubah kunci elemen yang datang setelahnya.
Ignacio Vazquez-Abrams

22
Sebenarnya, itu diperbolehkan karena array yang foreach gunakan secara internal adalah salinan dari array asli. Dengan begitu, memodifikasi array asli benar-benar aman.
Juan

68
Sebenarnya, itu diperbolehkan karena php itu gila sekali.
Eric G
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.