Bagaimana cara menghapus elemen array dan kemudian kembali indeks array?


206

Saya punya beberapa masalah dengan array. Saya punya satu array yang ingin saya modifikasi seperti di bawah ini. Saya ingin menghapus elemen (elemen) itu dengan indeks dan kemudian indeks ulang array. Apa itu mungkin?

$foo = array(

    'whatever', // [0]
    'foo', // [1]
    'bar' // [2]

);

$foo2 = array(

    'foo', // [0], before [1]
    'bar' // [1], before [2]

);

Jawaban:


456
unset($foo[0]); // remove item at index 0
$foo2 = array_values($foo); // 'reindex' array

6
Inilah yang ingin saya poskan, +1.
Michiel Pater

4
Ini lebih baik daripada solusi penipuan jika beberapa item perlu dihapus sekaligus - jika indeks barang-barang tersebut dikumpulkan sebelumnya. Setelah Anda menggunakan array_splice pada item pertama, Anda kehilangan indeks item lainnya.
Jānis Elmeris

23
Mungkin perlu dicatat bahwa Anda dapat membatalkan beberapa variabel / indeks array dalam satu panggilan tidak disetelunset($foo[0], $foo[3], $bar[1]);
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

solusi bro sangat bagus :)
Michael Kisilenko

Saya menggunakan ini. Terima kasih. Saya menggunakan array_splice, dan itu tidak berhasil untuk indeks ke-0 dan ke-1.
theGreenCabbage


29

Anda lebih baik menggunakan array_shift(). Itu akan mengembalikan elemen pertama array, menghapusnya dari array dan mengindeks ulang array. Semua dalam satu metode yang efisien.


2
Ini bagus ketika Anda ingin mengambil dan kemudian menghapus elemen array pertama, mengindeks ulang array dalam proses. Fungsi rekanannya array_pop()akan mengambil dan menghapus elemen array terakhir jika Anda membutuhkannya. Tapi, tidak ada fungsi yang dapat dibuat untuk bertindak pada elemen di tengah array.
Derrick Miller

1
Sementara ini ortogonal terkait, pertanyaannya adalah secara eksplisit tentang setiap elemen dari sebuah array, bukan hanya yang pertama.
Félix Gagnon-Grenier


9
Unset($array[0]); 

Sort($array); 

Saya tidak tahu mengapa ini sedang downvoting, tetapi jika ada yang repot untuk mencobanya, Anda akan melihat bahwa itu berhasil. Menggunakan sortir pada array menugaskan kembali kunci array. Satu-satunya kelemahan adalah memilah nilai. Karena kunci jelas akan dipindahkan, bahkan dengan array_values, tidak masalah adalah nilai sedang diurutkan atau tidak.


9
bahkan jika kunci akan dipindahkan, dalam jawaban yang benar, urutan awal akan disimpan.
s3v3n

1
"Saya ingin menghapus elemen (elemen) itu dengan indeks dan kemudian indeks ulang array. Apakah mungkin?" @ s3v3n OP tidak pernah meminta untuk mempertahankan pesanan awal. Saya hanya memberikan solusi yang berfungsi dan melakukan apa yang dinyatakan.
frostymarvelous

1
Pertanyaannya adalah 2 tahun. Biarkan saja!
s3v3n

@ s3v3n Ini bukan dendam. Saya hanya ingin tahu mengapa. Jelas untuk meningkatkan jawaban selanjutnya. Saya setuju bahwa ada metode yang lebih baik, tetapi adakah alasan jawaban ini sangat buruk? Apakah ini kinerja? dll? Alasan yang sama saya di SO, untuk belajar dan juga mengajar.
frostymarvelous

Dalam keadaan normal, sangat mungkin bahwa programmer akan membutuhkan nilai-nilai tersebut dalam urutan yang persis sama dengan inputnya. Mari kita ambil contoh beberapa baris dari database yang harus ditampilkan dalam tabel; atau aplikasi obrolan di mana balasan harus dalam urutan yang persis sama. Jumlah contoh bisa tak terbatas, intinya adalah bahwa dalam kebanyakan kasus urutannya harus sama atau setidaknya programmer akan mengharapkan urutan elemen yang sama dalam array.
s3v3n

4

Coba dengan:

$foo2 = array_slice($foo, 1);

Ini hanya berfungsi untuk elemen pertama dan bukan yang arbitrer.
Felix Kling

0

Selain jawaban xzyfer

Fungsinya

function custom_unset(&$array=array(), $key=0) {
    if(isset($array[$key])){

        // remove item at index
        unset($array[$key]);

        // 'reindex' array
        $array = array_values($array);

        //alternatively
        //$array = array_merge($array); 

    }
    return $array;
}

Menggunakan

$my_array=array(
    0=>'test0', 
    1=>'test1', 
    2=>'test2'
);

custom_unset($my_array, 1);

Hasil

 array(2) {
    [0]=>
    string(5) "test0"
    [1]=>
    string(5) "test2"
  }

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.