Lepszy sposób na usunięcie wielu elementów tablicy


84

Chodzi o to, że mam tablicę z 17 elementami. Chcę pobrać potrzebne elementy na określony czas i trwale usunąć je z tablicy.

Oto kod:

$name = $post['name'];
$email = $post['email'];
$address = $post['address'];
$telephone = $post['telephone'];
$country = $post['country'];

unset($post['name']);
unset($post['email']);
unset($post['address']);
unset($post['telephone']);
unset($post['country']);

Tak, kod jest brzydki, nie trzeba walić. Jak mam to poprawić?

Odpowiedzi:


109

Aby usunąć, użyj klucza array_diff_key

$remove = ['telephone', 'country'];

array_diff_key($post, array_flip($remove));

Możesz użyć array_intersect_key, jeśli chcesz podać tablicę kluczy do zachowania.


6
Nie rozumiem, dlaczego ta metoda nie jest akceptowana jako zwycięska odpowiedź, ponieważ faktycznie działa jak urok !!
Alex

Znakomity! Niezłe. Podoba mi się to zamiast zapętlania się po tablicy i rozbrajania elementów.
lifo

1
Inteligentne rozwiązanie !!
MAZux

inteligentne, ale powolne dla dużych tablic wejściowych. zawsze w stanie nieustawionym wydaje się znacznie szybsze przy dużych tablicach wejściowych i (przynajmniej) stosunkowo małej liczbie kluczy do usunięcia.
slepic

101

Wygląda na to, że funkcja extract()byłaby lepszym narzędziem do tego, co próbujesz zrobić (zakładając, że wyodrębnia wszystkie klucze / wartości z tablicy i przypisuje je do zmiennych o takich samych nazwach jak klucze w zakresie lokalnym). Po wyodrębnieniu zawartości możesz rozbroić całość $post, zakładając, że nie zawiera ona niczego innego, czego chciałeś.

Jednak, aby właściwie odpowiedzieć na swoje pytanie, możesz utworzyć tablicę kluczy, które chcesz usunąć i przez które pętli, jawnie je anulować ...

$removeKeys = array('name', 'email');

foreach($removeKeys as $key) {
   unset($arr[$key]);
}

... lub możesz wskazać zmienną nową tablicę, która ma usunięte klucze ...

$arr = array_diff_key($arr, array_flip($removeKeys));

... lub przekaż wszystkie składowe tablicy do unset()...

unset($arr['name'],  $arr['email']);

8
array_diff_key () to fajne rozwiązanie. Pomyślałem, że dodam, że możesz użyć array_intersect_key (), aby zrobić odwrotnie, zachować tylko niektóre elementy
batfastad.

1
Jestem z bbradley - array_diff_key to świetne rozwiązanie
Michael

Przez przypadek po prostu robiłem to z nieuporządkowanymi wszystkimi. Wtedy pomyślałem, że może być lepsze rozwiązanie. Google mnie tu prowadzi. Więc wypróbowałem array_diff_key i okazuje się, że jest znacznie wolniejszy niż foreach dla dużych tablic wejściowych (przynajmniej gdy liczba kluczy do usunięcia jest stosunkowo mała).
slepic

47

Jest inny sposób, który jest lepszy od powyższych przykładów. Źródło: http://php.net/manual/en/function.unset.php

Zamiast wykonywać pętlę w całej tablicy i usuwać wszystkie jej klucze, możesz po prostu ją raz usunąć:

Przykładowa tablica:

$array = array("key1", "key2", "key3");

Dla całej tablicy:

unset($array);

Unikalne klucze:

unset($array["key1"]);

W przypadku wielu kluczy w jednej tablicy:

unset($array["key1"], $array["key2"], $array["key3"] ....) and so on.

Mam nadzieję, że pomoże Ci to w rozwoju.


2

Rozumiem, że to pytanie jest stare, ale myślę, że optymalnym sposobem może być zrobienie tego:

$vars = array('name', 'email', 'address', 'phone'); /* needed variables */
foreach ($vars as $var) {
    ${$var} = $_POST[$var]; /* create variable on-the-fly */
    unset($_POST[$var]); /* unset variable after use */
}

Teraz możesz używać $ name, $ email, ... z dowolnego miejsca;)

Uwaga: extract () nie jest bezpieczne, więc nie ma o tym mowy!


Z ciekawości - dlaczego extract () nie jest bezpieczne?
Srdjan Marjanovic


O! Dobry! Dzięki!
Srdjan Marjanovic
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.