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

Turtel
źródło

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.

Tim
źródło
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']);
Alex
źródło
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.

CodingDaily
źródło
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!

Felix Imafidon
źródło
Z ciekawości - dlaczego extract () nie jest bezpieczne?
Srdjan Marjanovic
@SrdjanMarjanovic stackoverflow.com/questions/829407/…
Andrew
O! Dobry! Dzięki!
Srdjan Marjanovic