Cara terbaik untuk menghapus nilai-nilai array PHP

172

Mana yang lebih efisien untuk menghapus semua nilai dalam array? Yang pertama akan mengharuskan saya untuk menggunakan fungsi itu setiap kali di loop dari contoh kedua.

foreach ($array as $i => $value) {
    unset($array[$i]);
}

Atau ini

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}
el_pup_le
sumber
5
Ada apa dengan ini unset($array)?
Blake
13
menghapus variabel.
el_pup_le
2
Ya, tetapi mengapa Anda ingin mengevaluasi array nol yang Anda atur seperti itu?
Blake
3
Sumber? Tidak ada variabel dalam memori yang sepertinya tidak akan lebih kecil dari var adalah nol.
Blake

Jawaban:

256

Seperti yang dikatakan Zack dalam komentar di bawah ini, Anda hanya dapat instantiate ulang menggunakan

$foo = array(); // $foo is still here

Jika Anda menginginkan sesuatu yang lebih kuat, gunakan yang tidak disetel karena ini juga akan menghapus $ foo dari tabel simbol, jika Anda memerlukan array nanti instantiate saja.

unset($foo); // $foo is gone
$foo = array(); // $foo is here again
Eric Herlitz
sumber
63
Mengapa tidak instantiate saja sebagai $foo = array();?
Zack Zatkin-Gold
2
@NishamMahsin Baik digunakan global $foo; unset($foo);atauunset($GLOBALS['foo']);
Eric Herlitz
7
@vivoconunxino Saya menulis seperti itu karena pertanyaan penulis "Cara terbaik untuk menghapus nilai-nilai array PHP". Itu sais 'jelas', bukan 'contoh baru'. Menggunakan unsetakan menghapus $foodari tabel simbol. Saya kita berbicara tentang tabel yang sangat besar saya mungkin akan merekomendasikan $foo = null; unset($foo);karena itu juga akan menghapus memori sedikit lebih baik. Namun perilaku itu (GC) tidak terlalu konstan dan dapat berubah dari versi PHP.
Eric Herlitz
5
unset () terkadang sangat buruk dan dapat menyebabkan masalah, jika Anda salah menggunakannya. Itu tidak menjawab jawaban OP dengan benar. Tidak tahu mengapa dia menerima ini sebagai jawaban terbaik, komentarnya pada pertanyaannya sendiri mengatakan masalah dengan unset adalah menghapus variabel. Untuk melihat masalah yang disebabkan oleh solusi ini, lihat jawaban saya di sini .
Wolfsblvt
2
Untuk semua pendukung $foo = array();: sebenarnya mungkin ada masalah konseptual di dalamnya: re-instantiating struktur tidak sama dengan mengosongkannya. Ketika berhadapan dengan memori, Anda tahu itu tidak sama dengan alokasi yang lambat. Jadi, meskipun mudah digunakan, instantiasi ulang mungkin bukan jawaban untuk pertanyaan ini, terutama jika seseorang perlu melakukannya berkali-kali dan dengan cepat. Mungkin berhasil, tetapi itu akan sangat bergantung pada manajemen memori PHP, IMO.
TechNyquist
82

Jika Anda hanya ingin mengatur ulang variabel ke array kosong, Anda cukup menginisialisasi ulangnya:

$foo = array();

Perhatikan bahwa ini akan mempertahankan referensi apa pun untuknya:

$foo = array(1,2,3);
$bar = &$foo;
// ...
$foo = array(); // clear array
var_dump($bar); // array(0) { } -- bar was cleared too!

Jika Anda ingin memecah referensi apa pun, batalkan dulu:

$foo = array(1,2,3);
$bar = &$foo;
// ...
unset($foo); // break references
$foo = array(); // re-initialize to empty array
var_dump($bar); // array(3) { 1, 2, 3 } -- $bar is unchanged
Mpen
sumber
3
Saya pikir ini adalah jawaban terbaik. Harus diterima. Ini menunjukkan cara paling sederhana dan juga menjelaskan mengapa dan kapan unsetharus digunakan. +1
Ini adalah kode saya: justpaste.it/1gt46 . Bagaimana saya bisa mendeklarasikan lebih dari satu id dalam variabel. Deklarasi nilai tunggal adalah: $ productId = 19; Bagaimana saya bisa mendeklarasikan lebih dari satu nilai dalam $ productId =?
Permata
@Rathinam Tidak yakin apa yang harus dilakukan dengan menghapus array. Silakan kirim pertanyaan baru di Stackoverflow, dan rekatkan kode Anda langsung ke pertanyaan.
buka
32

Sayangnya saya tidak dapat menjawab pertanyaan-pertanyaan lain, tidak memiliki reputasi yang cukup, tetapi saya perlu menunjukkan sesuatu yang SANGAT penting bagi saya, dan saya pikir itu akan membantu orang lain juga.

Membatalkan pengaturan variabel adalah cara yang baik, kecuali jika Anda memerlukan referensi dari array asli!

Untuk memperjelas apa yang saya maksud: Jika Anda memiliki fungsi yang menggunakan referensi array, misalnya fungsi pengurutan seperti

function special_sort_my_array(&$array)
{
    $temporary_list = create_assoziative_special_list_out_of_array($array);

    sort_my_list($temporary_list);

    unset($array);
    foreach($temporary_list as $k => $v)
    {
        $array[$k] = $v;
    }
}

ini tidak bekerja! Hati-hati di sini, unsethapus referensi, sehingga variabel $arraydibuat lagi dan diisi dengan benar, tetapi nilainya tidak dapat diakses dari luar fungsi.

Jadi, jika Anda memiliki referensi, Anda harus menggunakan $array = array()alih-alih unset, meskipun itu kurang bersih dan mudah dimengerti.

Wolfsblvt
sumber
3
ini harus menjadi jawaban - OP mengatakan nilai array yang jelas, bukan men-referensi seluruh variabel array.
Ross
13

Saya akan mengatakan yang pertama, jika array asosiatif. Jika tidak, gunakan forloop:

for ($i = 0; $i < count($array); $i++) { unset($array[$i]); }

Meskipun jika memungkinkan, gunakan

$array = array();

Untuk mengatur ulang array ke array kosong lebih disukai.

Hantu Madara
sumber
6

Bagaimana dengan $array_name = array();?

Bibhas Debnath
sumber
5

Gunakan array_spliceuntuk mengosongkan array dan menyimpan referensi:

array_splice($myArray, 0);

Allan Jardine
sumber
2

saya telah menggunakan unset () untuk menghapus array tetapi saya telah menyadari bahwa unset () akan membuat array null maka kebutuhan untuk mendeklarasikan ulang array seperti misalnya

<?php 
    $arr = array();
    array_push($arr , "foo");
    unset($arr); // this will set the array to null hence you need the line below or redeclaring it.
    $arr  = array();

    // do what ever you want here
?>
Berkat
sumber
1

Saya melihat pertanyaan ini sudah lama, tetapi untuk masalah itu saya menulis fungsi rekursif untuk menghapus semua nilai dalam array. Rekursif karena kemungkinan bahwa nilai-nilai dari array yang diberikan juga merupakan array. Jadi itu bekerja untuk saya:

function empty_array(& $complete_array) {
    foreach($complete_array as $ckey => $cvalue)
    {
        if (!is_array($cvalue)) {
            $complete_array[$ckey] = "";
        } else {
            empty_array( $complete_array[$ckey]);
        }

    }
    return $complete_array;

}

Jadi dengan itu saya mendapatkan array dengan semua kunci dan sub-array, tetapi nilai kosong.

Bueck0815
sumber
1

Mungkin sederhana, cara ekonomis (lebih sedikit rambu untuk digunakan) ...

$array = [];

Kita bisa membaca dalam manual php:

Pada PHP 5.4 Anda juga dapat menggunakan sintaks array pendek, yang menggantikan array () dengan [].

PHP php
sumber
Anda juga harus menjelaskannya.
Kulshreshth K
0

Fungsi tidak disetel berguna ketika pengumpul sampah melakukan putaran sambil tidak istirahat makan siang;

Namun fungsi yang tidak disetel hanya menghancurkan referensi variabel ke data, data masih ada dalam memori dan PHP melihat memori sebagai digunakan meskipun tidak lagi memiliki pointer ke sana.

Solusi: Tetapkan nullvariabel Anda untuk menghapus data, setidaknya sampai penampung sampah dapat memperolehnya.

$var = null;

dan kemudian hapus dengan cara yang sama!

unset($var);
Waqar Alamgir
sumber
4
Kedengarannya tidak benar. Saya tidak berpikir pengaturan itu nullakan memaksa pengumpulan sampah segera. Apakah Anda punya referensi untuk itu?
mpen
@mpen Apakah Anda setuju bahwa penetapan NULLakan menggantikan nilai yang disimpan di lokasi $varvariabel dalam contoh ini?
Anthony Rutledge
1
@AnthonyRutledge Tidak, saya tidak. Sejauh yang saya tahu, PHP hanya akan memperbarui $varuntuk menunjuk ke beberapa NULLobjek global dan meninggalkan $vardata sendiri sampai sampah terkumpul. Mengapa penerjemah dipaksa untuk menimpa data itu segera?
mpen
@mpen Itu pertanyaan yang bagus, tapi di dunia itu setidaknya semuanya siap dikumpulkan.
Anthony Rutledge
Memang. Intinya adalah bahwa saya ragu mengaturnya ke nol sebelum tidak menyetelnya akan membantu
mpen
-1

Ini kuat dan teruji tidak disetel ($ gradearray); // atur ulang array

Charles
sumber
1
Untuk menjawab pertanyaan, Anda harus menjelaskan yang merupakan cara terbaik dan mengapa
Fabian Horlacher