J'ai deux tableaux en PHP comme suit:
Gens:
Array
(
[0] => 3
[1] => 20
)
Criminels recherchés:
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
)
Comment vérifier si l' un des éléments People se trouve dans le tableau Wanted Criminals ?
Dans cet exemple, il devrait revenir true
car il 20
est dans Wanted Criminals .
!empty
cela ne fonctionne pas comme prévu . Au lieu de cela, j'ai utilisécount()
:!count(array_intersect($people, $criminals));
Il y a peu de mal à utiliser array_intersect () et count () (au lieu de empty).
Par exemple:
la source
count()
n'est pas considéré comme performant (si vous vous souciez de la micro-optimisation, c'est-à-dire)si «vide» n'est pas le meilleur choix, qu'en est-il de ceci:
ou
la source
Ce code n'est pas valide car vous ne pouvez passer des variables que dans des constructions de langage.
empty()
est une construction de langage.Vous devez le faire en deux lignes:
la source
Test de performances pour in_array vs array_intersect:
Voici les résultats:
in_array est au moins 5 fois plus rapide. Notez que nous "cassons" dès qu'un résultat est trouvé.
la source
array_intersect()
.isset
est encore plus rapide. Et vous pouvez utiliser bool val pour activer ou désactiver. Les valeurs de recherche comme clé garantissent également qu'il n'y a pas de doublons. ´array_intersect moy: 0,52077736854553; in_array avg: 0,015597295761108; isset avg: 0,0077081203460693´Vous pouvez également utiliser in_array comme suit:
Bien que array_intersect soit certainement plus pratique à utiliser, il s'avère que ce n'est pas vraiment supérieur en termes de performances. J'ai aussi créé ce script:
Ensuite, j'ai exécuté les deux extraits respectivement sur: http://3v4l.org/WGhO7/perf#tabs et http://3v4l.org/g1Hnu/perf#tabs et vérifié les performances de chacun. La chose intéressante est que le temps CPU total, c'est-à-dire temps utilisateur + temps système est le même pour PHP5.6 et la mémoire est également la même. Le temps CPU total sous PHP5.4 est moindre pour in_array que pour array_intersect, bien que marginalement.
la source
in_array
implémentation.Voici une façon de le faire après avoir fait des recherches pendant un moment. Je voulais créer un point de terminaison d'API Laravel qui vérifie si un champ est "en cours d'utilisation", les informations importantes sont donc: 1) quelle table DB? 2) quelle colonne DB? et 3) y a-t-il une valeur dans cette colonne qui correspond aux termes de recherche?
Sachant cela, nous pouvons construire notre tableau associatif:
Ensuite, nous pouvons définir nos valeurs que nous vérifierons:
Ensuite, nous pouvons utiliser
array_key_exists()
etin_array()
avec eachother pour exécuter un combo en une, deux étapes, puis agir sur latruthy
condition:Je m'excuse pour le code PHP spécifique à Laravel, mais je vais le laisser car je pense que vous pouvez le lire sous forme de pseudo-code. La partie importante est les deux
if
instructions qui sont exécutées de manière synchrone.la source:
https://php.net/manual/en/function.array-key-exists.php
https://php.net/manual/en/function.in-array.php
La bonne chose à propos de l'algorithme que j'ai montré ci - dessus est que vous pouvez faire un point de terminaison REST tels que
GET /in-use/{table}/{column}/{value}
(oùtable
,column
etvalue
sont des variables).Tu aurais pu:
puis vous pouvez faire des requêtes GET telles que:
GET /in-use/accounts/account_name/Bob's Drywall
(vous devrez peut-être encoder uri la dernière partie, mais généralement pas)GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/[email protected]
Notez également que personne ne peut faire:
GET /in-use/users/password/dogmeat1337
carpassword
n'est pas répertorié dans votre liste de colonnes autorisées pouruser
.Bonne chance pour ton voyage.
la source
$SEARCHABLE_TABLE_COLUMNS
! Cela crie pour une injection - peu importe s'il y a un "générateur de requêtes de cadre ultra sécurisé" entre qui tente de masquer et de filtrer les chaînes de table et de colonne! À la fin de la table et des colonnes, les chaînes ne peuvent pas être ajoutées via un espace réservé (instructions préparées) et doivent être insérées directement commeSELECT ... FROM {$table} WHERE {$column} = :placeholder ....
. Ofc dépend des adaptateurs (mysql, mongo, ...) MAIS ce n'est pas un argument à sauvegarder! Pls statique ou pas de liste =)