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.