Mam dwie tablice w PHP w następujący sposób:
Ludzie:
Array
(
[0] => 3
[1] => 20
)
Poszukiwani przestępcy:
Array
(
[0] => 2
[1] => 4
[2] => 8
[3] => 11
[4] => 12
[5] => 13
[6] => 14
[7] => 15
[8] => 16
[9] => 17
[10] => 18
[11] => 19
[12] => 20
)
Jak sprawdzić, czy którykolwiek z elementów People znajduje się w tablicy Wanted Criminals ?
W tym przykładzie powinien powrócić, true
ponieważ 20
znajduje się w Poszukiwani przestępcy .
!empty
nie działa zgodnie z oczekiwaniami . Zamiast tego użyłemcount()
:!count(array_intersect($people, $criminals));
Nie ma nic złego w używaniu array_intersect () i count () (zamiast pustego).
Na przykład:
źródło
count()
nie jest uważany za wydajny ( to znaczy, jeśli zależy ci na mikrooptymalizacji)jeśli „pusty” nie jest najlepszym wyborem, co z tym:
lub
źródło
Ten kod jest nieprawidłowy, ponieważ możesz przekazywać zmienne tylko do konstrukcji językowych.
empty()
jest konstrukcją językową.Musisz to zrobić w dwóch wierszach:
źródło
Test wydajności dla in_array vs array_intersect:
Oto wyniki:
in_array jest co najmniej 5 razy szybsze. Zwróć uwagę, że „przerywamy”, gdy tylko zostanie znaleziony wynik.
źródło
array_intersect()
.isset
jest jeszcze szybsza. I możesz użyć bool val, aby włączyć lub wyłączyć. Również wartości wyszukiwania jako klucz zapewniają, że nie ma duplikatów. ´array_intersect avg: 0,52077736854553; in_array avg: 0,015597295761108; isset Średnia: 0.0077081203460693'Możesz również użyć in_array w następujący sposób:
Chociaż array_intersect jest z pewnością wygodniejszy w użyciu, okazuje się, że nie jest lepszy pod względem wydajności. Stworzyłem też ten skrypt:
Następnie uruchomiłem oba fragmenty odpowiednio pod adresem: http://3v4l.org/WGhO7/perf#tabs i http://3v4l.org/g1Hnu/perf#tabs i sprawdziłem wydajność każdego z nich. Ciekawostką jest to, że całkowity czas procesora, tj. Czas użytkownika + czas systemowy, jest taki sam dla PHP5.6, a pamięć też jest taka sama. Całkowity czas procesora w PHP5.4 jest mniejszy dla in_array niż array_intersect, choć marginalnie.
źródło
in_array
implementacji.Oto sposób, w jaki robię to po pewnym czasie badania. Chciałem stworzyć punkt końcowy API Laravel, który sprawdza, czy pole jest „używane”, więc ważne informacje to: 1) która tabela DB? 2) jaka kolumna DB? i 3) czy w tej kolumnie znajduje się wartość, która pasuje do wyszukiwanych haseł?
Wiedząc to, możemy skonstruować naszą tablicę asocjacyjną:
Następnie możemy ustawić nasze wartości, które sprawdzimy:
Następnie możemy użyć
array_key_exists()
iin_array()
wspólnie wykonać jedno, dwuetapowe combo, a następnie działać podtruthy
warunkiem:Przepraszam za kod PHP specyficzny dla Laravel, ale zostawię go, ponieważ myślę, że można go odczytać jako pseudokod. Ważną częścią są dwie
if
instrukcje, które są wykonywane synchronicznie.źródło:
https://php.net/manual/en/function.array-key-exists.php
https://php.net/manual/en/function.in-array.php
Zaletą algorytmu, który pokazałem powyżej jest to, że można zrobić końcowy REST takich jak
GET /in-use/{table}/{column}/{value}
(gdzietable
,column
ivalue
są zmienne).Możesz mieć:
a następnie możesz wykonać żądania GET, takie jak:
GET /in-use/accounts/account_name/Bob's Drywall
(może być konieczne zakodowanie ostatniej części w formacie uri, ale zwykle nie)GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/[email protected]
Zauważ również, że nikt nie może zrobić:
GET /in-use/users/password/dogmeat1337
ponieważpassword
nie ma go na liście dozwolonych kolumn dlauser
.Powodzenia w podróży.
źródło
$SEARCHABLE_TABLE_COLUMNS
! To krzyczy o zastrzyk - bez względu na to, czy pomiędzy próbami maskowania i filtrowania ciągów tabel i kolumn jest „ultra bezpieczny framework do tworzenia zapytań”! Na końcu tabeli i kolumn nie można dodawać za pomocą symbolu zastępczego (przygotowanych instrukcji) i należy je wstawiać bezpośrednio tak, jakSELECT ... FROM {$table} WHERE {$column} = :placeholder ....
. Ofc zależy od adapterów (mysql, mongo, ...) ALE to nie jest argument do oszczędzania! Pls statyczny lub brak listy =)