Najlepszy sposób na wyczyszczenie wartości tablicy PHP

172

Który z nich jest bardziej wydajny w usuwaniu wszystkich wartości w tablicy? Pierwsza wymagałaby ode mnie używania tej funkcji za każdym razem w pętli drugiego przykładu.

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

Albo to

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}
el_pup_le
źródło
5
Co jest nie tak unset($array)?
Blake
13
usuwa zmienną.
el_pup_le
2
Tak, ale dlaczego miałbyś chcieć oceniać tablicę zerową, którą ustawiłeś w ten sposób?
Blake
3
Źródło? Żadna zmienna w pamięci nie wydaje się być mniejsza niż wartość var ​​jest zerowa.
Blake

Odpowiedzi:

256

Jak powiedział Zack w komentarzach poniżej, możesz po prostu ponownie utworzyć instancję przy użyciu

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

Jeśli chcesz czegoś mocniejszego, użyj nieustawionego, ponieważ spowoduje to również usunięcie $ foo z tablicy symboli, jeśli będziesz potrzebować tablicy później, po prostu utwórz jej instancję ponownie.

unset($foo); // $foo is gone
$foo = array(); // $foo is here again
Eric Herlitz
źródło
63
Dlaczego po prostu nie utworzyć go ponownie jako $foo = array();?
Zack Zatkin-Gold
2
@NishamMahsin Albo użyj global $foo; unset($foo);lubunset($GLOBALS['foo']);
Eric Herlitz
7
@vivoconunxino Napisałem to w ten sposób, ponieważ autorzy pytają „Najlepszy sposób na wyczyszczenie wartości tablicy PHP”. Jest to „jasne”, a nie „nowe wystąpienie”. Użycie unsetspowoduje usunięcie $fooz tablicy symboli. Mówię o bardzo dużych stołach, które prawdopodobnie poleciłbym, $foo = null; unset($foo);ponieważ to również wyczyściłoby nieco pamięć. To zachowanie (GC) nie jest jednak bardzo stałe i może się zmieniać w wersjach PHP.
Eric Herlitz
5
unset () jest czasami bardzo złe i może powodować problemy, jeśli używasz go nieprawidłowo. Nie odpowiada poprawnie na odpowiedzi PO. Nie wiem, dlaczego przyjął to jako najlepszą odpowiedź, jego komentarz do własnego pytania mówi, że problem z nieustawionym polega na tym, że usuwa zmienną. Aby zobaczyć, jakie problemy powoduje to rozwiązanie, spójrz na moją odpowiedź tutaj .
Wolfsblvt
2
Do wszystkich wspierających $foo = array();: w rzeczywistości może być w tym problem koncepcyjny: ponowne utworzenie instancji struktury to nie to samo, co jej opróżnienie. Kiedy masz do czynienia z pamięcią, wiesz, że to nie to samo, co alokacja jest powolna. Tak więc, pomimo łatwości użytkowania, ponowne tworzenie instancji może nie być odpowiedzią na to pytanie, zwłaszcza jeśli trzeba to zrobić wiele razy i szybko. To może działać, ale w dużym stopniu będzie zależało od zarządzania pamięcią PHP, IMO.
TechNyquist
82

Jeśli chcesz tylko zresetować zmienną do pustej tablicy, możesz ją po prostu ponownie zainicjować:

$foo = array();

Pamiętaj, że zachowa to wszelkie odniesienia do niego:

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

Jeśli chcesz zerwać jakiekolwiek odniesienia do niego, najpierw usuń jego ustawienie:

$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
źródło
3
Myślę, że to najlepsza odpowiedź. Powinien zostać zaakceptowany. Pokazuje najprostszy sposób, a także opisuje, dlaczego i kiedy unsetnależy je stosować. +1
To jest mój kod: justpaste.it/1gt46 . Jak mogę zadeklarować więcej niż jeden identyfikator w zmiennej. Deklaracja pojedynczej wartości to: $ productId = 19; Jak mogę zadeklarować więcej niż jedną wartość w $ productId =?
Gem
@Rathinam Nie wiem, co to ma wspólnego z czyszczeniem tablicy. Opublikuj nowe pytanie na Stackoverflow i wklej swój kod bezpośrednio do pytania.
mpen
32

Niestety nie mogę odpowiedzieć na inne pytania, nie mam wystarczającej reputacji, ale muszę wskazać na coś, co było dla mnie BARDZO ważne i myślę, że pomoże to również innym ludziom.

Cofnięcie wartości zmiennej jest dobrym sposobem, chyba że potrzebujesz odniesienia do oryginalnej tablicy!

Aby wyjaśnić, co mam na myśli: Jeśli masz funkcję, która używa odwołania do tablicy, na przykład funkcję sortowania, taką jak

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

to nie działa! Zachowaj ostrożność, unsetusuwa odniesienie, więc zmienna $arrayjest tworzona ponownie i poprawnie wypełniana, ale wartości nie są dostępne z zewnątrz funkcji.

Więc jeśli masz odniesienia, musisz użyć $array = array()zamiast unset, nawet jeśli jest mniej czysty i zrozumiały.

Wolfsblvt
źródło
3
to powinna być odpowiedź - OP mówi, że wyczyść wartości tablic, a nie usuwaj odniesienia do całej zmiennej tablicowej.
Ross
13

Powiedziałbym pierwszy, jeśli tablica jest asocjacyjna. Jeśli nie, użyj forpętli:

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

Chociaż jeśli to możliwe, użycie

$array = array();

Preferowane jest zresetowanie tablicy do pustej tablicy.

Duch Madary
źródło
6

A co powiesz $array_name = array();?

Bibhas Debnath
źródło
5

Użyj, array_spliceaby opróżnić tablicę i zachować odniesienie:

array_splice($myArray, 0);

Allan Jardine
źródło
2

Użyłem unset () do wyczyszczenia tablicy, ale zdałem sobie sprawę, że unset () spowoduje, że tablica będzie null, stąd potrzeba ponownego zadeklarowania tablicy, jak na przykład

<?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
?>
Błogosławieństwo
źródło
1

Widzę, że to pytanie jest naprawdę stare, ale dla tego problemu napisałem funkcję rekurencyjną, aby usunąć wszystkie wartości w tablicy. Rekursywne, ponieważ możliwe, że wartości z danej tablicy są również tablicą. Więc to działa dla mnie:

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;

}

Dzięki temu otrzymuję tablicę ze wszystkimi kluczami i pod-tablicami, ale pustymi wartościami.

Bueck0815
źródło
1

Może prosty, ekonomiczny sposób (mniej znaków do użycia) ...

$array = [];

W podręczniku php możemy przeczytać:

Od PHP 5.4 możesz także używać składni krótkich tablic, która zamienia array () na [].

PHP php
źródło
Powinieneś to również wyjaśnić.
Kulshreshth K,
0

Funkcja unset jest przydatna, gdy garbage collector robi swoje obchody bez przerwy na lunch;

jednak nieustawiona funkcja po prostu niszczy zmienną referencyjną do danych, dane nadal istnieją w pamięci i PHP widzi pamięć jako używaną, mimo że nie ma już do niej wskaźnika.

Rozwiązanie: przypisz nullzmienne, aby wyczyścić dane, przynajmniej do momentu, gdy moduł odśmiecania je przechwyci.

$var = null;

a następnie rozbroić go w podobny sposób!

unset($var);
Waqar Alamgir
źródło
4
To nie brzmi dobrze. Nie sądzę, aby ustawienie go na nullwymusiło natychmiastowe usuwanie elementów bezużytecznych. Czy masz do tego odniesienie?
mpen
@mpen Czy zgadzasz się, że przypisanie NULLspowoduje zastąpienie wartości przechowywanej w lokalizacji $varzmiennej w tym przykładzie?
Anthony Rutledge,
1
@AnthonyRutledge Nie, ja nie. Z tego, co wiem, PHP po prostu zaktualizuje się, $varaby wskazać jakiś NULLobiekt globalny i pozostawi $vardane w spokoju, dopóki nie zostaną usunięte. Dlaczego tłumacz miałby być zmuszony do natychmiastowego nadpisania tych danych?
otwarte
@mpen To dobre pytanie, ale przynajmniej w tym świecie wszystko jest gotowe do zebrania.
Anthony Rutledge,
W rzeczy samej.
Chodzi o
-1

Jest to potężne i przetestowane w stanie nieustawionym ($ gradearray); // ponownie ustaw tablicę

Charles
źródło
1
Aby odpowiedzieć na pytanie, należy wyjaśnić, który sposób jest najlepszy i dlaczego
Fabian Horlacher,