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

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

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

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.


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.





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
?>

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.


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 [].


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

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ę


1
Aby odpowiedzieć na pytanie, należy wyjaśnić, który sposób jest najlepszy i dlaczego
Fabian Horlacher,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.