Funkcja zwrotna array_filter()
przekazuje tylko wartości tablicy, a nie klucze.
Jeżeli mam:
$my_array = array("foo" => 1, "hello" => "world");
$allowed = array("foo", "bar");
Jaki jest najlepszy sposób na usunięcie wszystkich kluczy $my_array
, których nie ma w $allowed
tablicy?
Pożądane wyjście:
$my_array = array("foo" => 1);
$b = ['foo' => $a['foo'], 'bar' => $a['bar']]
to spowoduje$b['bar']
BEnull
.Odpowiedzi:
PHP 5.6 wprowadzono trzeci parametr do
array_filter()
,flag
, które można ustawić, abyARRAY_FILTER_USE_KEY
do filtra przez klucz zamiast wartości:Oczywiście nie jest to tak eleganckie
array_intersect_key($my_array, array_flip($allowed))
, ale oferuje dodatkową elastyczność wykonywania dowolnego testu na kluczu, np.$allowed
Może zawierać wzorce regularne zamiast zwykłych ciągów.Możesz także użyć,
ARRAY_FILTER_USE_BOTH
aby zarówno wartość, jak i klucz zostały przekazane do funkcji filtrowania. Oto wymyślony przykład oparty na pierwszym, ale zauważ, że nie polecam kodowania reguł filtrowania w$allowed
ten sposób:źródło
array_intersect
Z
array_intersect_key
iarray_flip
:źródło
array_flip
? Wystarczy zdefiniować za$allowed
pomocą klawiszy:allowed = array ( 'foo' => 1, 'bar' => 1 );
Musiałem zrobić to samo, ale z bardziej złożonymi
array_filter
kluczami.Oto jak to zrobiłem, używając podobnej metody.
To daje wynik:
źródło
Oto bardziej elastyczne rozwiązanie z zamknięciem:
Wyjścia:
Tak więc w funkcji możesz wykonać inne określone testy.
źródło
Jeśli szukasz metody filtrowania tablicy według ciągu występującego w kluczach, możesz użyć:
Rezultatem
print_r($mResult)
jestDostosowanie tej odpowiedzi, które obsługuje wyrażenia regularne
Wynik
źródło
stristr
z „pracy” tej funkcji czyni pewne założenia dla użytkownika końcowego. Być może lepiej byłoby pozwolić użytkownikowi na przekazanie wyrażenia regularnego; dałoby im to większą elastyczność w odniesieniu do niektórych rzeczy, takich jak kotwice, granice słów i rozróżnianie wielkości liter itp.Jak uzyskać bieżący klucz tablicy podczas używania
array_filter
Niezależnie od tego, jak podoba mi się rozwiązanie Vincenta dla problemu Mačka, tak naprawdę nie działa
array_filter
. Jeśli przyszedłeś tutaj z wyszukiwarki, być może szukasz czegoś takiego ( PHP> = 5.3 ):Przekazuje tablicę, którą filtrujesz, jako odniesienie do wywołania zwrotnego. Ponieważ
array_filter
konwencjonalnie nie iteruje się po tablicy, zwiększając jej publiczny wskaźnik wewnętrzny, musisz ją przesuwać samodzielnie.Ważne jest tutaj, aby upewnić się, że tablica została zresetowana, w przeciwnym razie możesz zacząć dokładnie w jej środku.
W PHP> = 5.4 możesz uczynić callback jeszcze krótszym:
źródło
Oto mniej elastyczna alternatywa przy użyciu unset () :
Wynik
print_r($array)
bycia:Nie ma to zastosowania, jeśli chcesz zachować odfiltrowane wartości do późniejszego użycia, ale bardziej uporządkowane, jeśli masz pewność, że nie.
źródło
unset()
. Jeśli klucz nie istnieje, nie są generowane żadne ostrzeżenia.Począwszy od PHP 5.6, możesz użyć
ARRAY_FILTER_USE_KEY
flagi warray_filter
:W przeciwnym razie możesz użyć tej funkcji ( z TestDummy ):
A oto moja ulepszona wersja, która akceptuje oddzwonienie lub bezpośrednio klucze:
Last but not least, możesz również użyć prostego
foreach
:źródło
Być może przesada, jeśli potrzebujesz jej tylko raz, ale możesz użyć biblioteki YaLinqo * do filtrowania kolekcji (i wykonywania innych transformacji). Ta biblioteka pozwala na wykonywanie zapytań podobnych do SQL na obiektach o płynnej składni. Jego
where
funkcja akceptuje funkcję calback z dwoma argumentami: wartością i kluczem. Na przykład:(
where
Funkcja zwraca iterator, więc jeśli potrzebujesz tylkoforeach
raz->toArray()
wykonać wynikową sekwencję, możesz ją usunąć.)* opracowane przeze mnie
źródło
funkcja filtrowania tablicy z php:
$ array - To jest tablica wejściowa
$ callback_function - Funkcja zwrotna, której należy użyć, jeśli funkcja zwrotna zwraca true , bieżąca wartość z tablicy jest zwracana do tablicy wynikowej.
Flaga $ - jest to parametr opcjonalny , który określa, jakie argumenty są wysyłane do funkcji zwrotnej. Jeśli ten parametr jest pusty, wówczas funkcja wywołania zwrotnego przyjmuje wartości tablicowe jako argument. Jeśli chcesz wysłać klucz tablicy jako argument, użyj flagi $ jako ARRAY_FILTER_USE_KEY . Jeśli chcesz wysłać zarówno klucze, jak i wartości, powinieneś użyć flagi $ jako ARRAY_FILTER_USE_BOTH .
Na przykład: Rozważ prostą tablicę
Jeśli chcesz filtrować tablicę na podstawie klucza tablicy , musimy użyć ARRAY_FILTER_USE_KEY jako trzeciego parametru funkcji tablicy array_filter.
Jeśli chcesz filtrować tablicę na podstawie klucza tablicy i wartości tablicy , musimy użyć ARRAY_FILTER_USE_BOTH jako trzeciego parametru funkcji tablicy array_filter.
Przykładowe funkcje oddzwaniania:
Wyjdzie
źródło
Dzięki tej funkcji możesz filtrować tablicę wielowymiarową
źródło
źródło
Naiwne i brzydkie (ale wydaje się być szybsze) rozwiązanie?
Próbowałem tego tylko w php 7.3.11, ale brzydka pętla wydaje się działać w około jednej trzeciej czasu. Podobne wyniki dla tablicy zawierającej kilkaset kluczy. Mikrooptymalizacja, prawdopodobnie nieużyteczna w RW, ale była zaskakująca i interesująca:
źródło
źródło