Ich habe zwei Arrays in PHP wie folgt:
Menschen:
Array
(
[0] => 3
[1] => 20
)
Gesuchte Kriminelle:
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
)
Wie kann ich überprüfen , ob jede der Menschen Elemente in denen sind Verbrecher Array?
In diesem Beispiel sollte es zurückgegeben werden, true
da 20
es sich um gesuchte Kriminelle handelt .
!empty
dies nicht wie erwartet funktioniert . Stattdessen habe ich verwendetcount()
:!count(array_intersect($people, $criminals));
Es ist wenig falsch, array_intersect () und count () (anstelle von leer) zu verwenden.
Beispielsweise:
quelle
count()
wird aber nicht als performant angesehen (wenn Sie sich für Mikrooptimierung interessieren)Wenn "leer" nicht die beste Wahl ist, was ist dann damit:
oder
quelle
Dieser Code ist ungültig, da Sie nur Variablen an Sprachkonstrukte übergeben können.
empty()
ist ein Sprachkonstrukt.Sie müssen dies in zwei Zeilen tun:
quelle
Leistungstest für in_array vs array_intersect:
Hier sind die Ergebnisse:
in_array ist mindestens 5 mal schneller. Beachten Sie, dass wir "brechen", sobald ein Ergebnis gefunden wird.
quelle
array_intersect()
.isset
ist noch schneller. Und Sie können bool val zum Aktivieren oder Deaktivieren verwenden. Auch die Suchwerte als Schlüssel stellen sicher, dass keine Duplikate vorhanden sind. ´array_intersect avg: 0.52077736854553; in_array avg: 0.015597295761108; isset avg: 0.0077081203460693´Sie können in_array auch wie folgt verwenden:
Array_intersect ist sicherlich bequemer zu bedienen, es stellt sich jedoch heraus, dass es in Bezug auf die Leistung nicht wirklich überlegen ist. Ich habe auch dieses Skript erstellt:
Dann habe ich beide Snippets unter http://3v4l.org/WGhO7/perf#tabs und http://3v4l.org/g1Hnu/perf#tabs ausgeführt und die Leistung der einzelnen Snippets überprüft. Das Interessante ist, dass die Gesamt-CPU-Zeit, dh Benutzerzeit + Systemzeit, für PHP5.6 gleich ist und der Speicher auch gleich ist. Die Gesamt-CPU-Zeit unter PHP5.4 ist für in_array geringer als für array_intersect, wenn auch nur geringfügig.
quelle
in_array
Implementierung.Hier ist eine Möglichkeit, wie ich es mache, nachdem ich es eine Weile recherchiert habe. Ich wollte einen Laravel-API-Endpunkt erstellen, der prüft, ob ein Feld "verwendet" wird. Die folgenden wichtigen Informationen lauten daher: 1) Welche DB-Tabelle? 2) Welche DB-Spalte? und 3) gibt es in dieser Spalte einen Wert, der mit den Suchbegriffen übereinstimmt?
Wenn wir das wissen, können wir unser assoziatives Array konstruieren:
Dann können wir unsere Werte festlegen, die wir überprüfen werden:
Dann können wir
array_key_exists()
und zusammenin_array()
eine ein-, zweistufige Kombination ausführen und dann auf dietruthy
Bedingung reagieren:Ich entschuldige mich für den Laravel-spezifischen PHP-Code, aber ich werde ihn verlassen, weil ich denke, dass Sie ihn als Pseudocode lesen können. Der wichtige Teil sind die beiden
if
Anweisungen, die synchron ausgeführt werden.Quelle:
https://php.net/manual/en/function.array-key-exists.php
https://php.net/manual/en/function.in-array.php
Das Schöne an dem Algorithmus , dass ich oben zeigte , ist , dass Sie einen REST - Endpunkt wie machen können
GET /in-use/{table}/{column}/{value}
(wotable
,column
undvalue
sind Variablen).Du könntest haben:
und dann könnten Sie GET-Anfragen stellen wie:
GET /in-use/accounts/account_name/Bob's Drywall
(Möglicherweise müssen Sie den letzten Teil uri-codieren, normalerweise jedoch nicht.)GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/[email protected]
Beachten Sie auch, dass niemand tun kann:
GET /in-use/users/password/dogmeat1337
weilpassword
ist nicht in Ihrer Liste der zulässigen Spalten für aufgeführtuser
.Viel Glück auf Ihrer Reise.
quelle
$SEARCHABLE_TABLE_COLUMNS
! Dies schreit nach einer Injektion - egal ob es einen "ultra sicheren Framework-Abfrage-Builder" gibt, der versucht, Tabellen- und Spaltenzeichenfolgen zu maskieren und zu filtern! Am Ende können Tabellen- und Spaltenzeichenfolgen nicht über Platzhalter (vorbereitete Anweisungen) hinzugefügt werden und müssen direkt wie eingefügt werdenSELECT ... FROM {$table} WHERE {$column} = :placeholder ....
. Ofc hängt von Adaptern ab (MySQL, Mongo, ...), ABER das ist kein Argument, um sicher zu sein! Pls statische oder keine Liste =)