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;
}
unset($array)
?Odpowiedzi:
Jak powiedział Zack w komentarzach poniżej, możesz po prostu ponownie utworzyć instancję przy użyciu
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.
źródło
$foo = array();
?global $foo; unset($foo);
lubunset($GLOBALS['foo']);
unset
spowoduje usunięcie$foo
z 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.$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.Jeśli chcesz tylko zresetować zmienną do pustej tablicy, możesz ją po prostu ponownie zainicjować:
Pamiętaj, że zachowa to wszelkie odniesienia do niego:
Jeśli chcesz zerwać jakiekolwiek odniesienia do niego, najpierw usuń jego ustawienie:
źródło
unset
należy je stosować. +1Niestety 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
to nie działa! Zachowaj ostrożność,
unset
usuwa odniesienie, więc zmienna$array
jest 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()
zamiastunset
, nawet jeśli jest mniej czysty i zrozumiały.źródło
Powiedziałbym pierwszy, jeśli tablica jest asocjacyjna. Jeśli nie, użyj
for
pętli:Chociaż jeśli to możliwe, użycie
Preferowane jest zresetowanie tablicy do pustej tablicy.
źródło
Czy to nie
unset()
wystarczy?źródło
A co powiesz
$array_name = array();
?źródło
Użyj,
array_splice
aby opróżnić tablicę i zachować odniesienie:array_splice($myArray, 0);
źródło
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
źródło
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:
Dzięki temu otrzymuję tablicę ze wszystkimi kluczami i pod-tablicami, ale pustymi wartościami.
źródło
Może prosty, ekonomiczny sposób (mniej znaków do użycia) ...
W podręczniku php możemy przeczytać:
źródło
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
null
zmienne, aby wyczyścić dane, przynajmniej do momentu, gdy moduł odśmiecania je przechwyci.a następnie rozbroić go w podobny sposób!
źródło
null
wymusiło natychmiastowe usuwanie elementów bezużytecznych. Czy masz do tego odniesienie?NULL
spowoduje zastąpienie wartości przechowywanej w lokalizacji$var
zmiennej w tym przykładzie?$var
aby wskazać jakiśNULL
obiekt globalny i pozostawi$var
dane w spokoju, dopóki nie zostaną usunięte. Dlaczego tłumacz miałby być zmuszony do natychmiastowego nadpisania tych danych?Jest to potężne i przetestowane w stanie nieustawionym ($ gradearray); // ponownie ustaw tablicę
źródło