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.

ababa
sumber

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

pablo.meier
sumber
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);
    }
}
ber-dex
sumber
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]);
        }
    }
}
Josh
sumber
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;
        }
    }
}
magallanes
sumber
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.

Corey Sunwold
sumber
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