Fonction IN_ARRAY

Eléphanteau du PHP | 20 Messages

12 juil. 2019, 09:48

Bonjour à tous,

Je débute en php et j’essaie de comprendre le fonctionnement de certaines fonctions.

Code : Tout sélectionner

<?php $mots = ['cool','sympa','gentil']; $phrase = "Ce mec est sympa"; $i = in_array($phrase, $mots); if ($i == TRUE) { echo "Cette phrase contient un mot du tableau."; } else { echo "Cette phrase ne contient pas un mot du tableau."; } ?>

Pourquoi $i est considéré comme FALSE puisque le mot sympa est bien dans mon tableau $mots ?

Mammouth du PHP | 678 Messages

12 juil. 2019, 10:21

non, "sympa" n'est pas égal à "Ce mec est sympa"
https://www.php.net/manual/fr/function.strpos.php pour chercher une partie d'une chaine.

Eléphanteau du PHP | 20 Messages

12 juil. 2019, 14:21

Selon PHP.NET, je cite :
in_array — Indique si une valeur appartient à un tableau

Description ¶
in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : bool

Recherche needle dans haystack en utilisant une comparaison souple à moins que strict ne soit utilisé.

Liste de paramètres ¶
needle : La valeur recherchée.
Note: Si needle est une chaîne de caractères, la comparaison est faite en tenant compte de la casse.

haystack : Le tableau.
needle pouvant être une chaine de caractères, j'en déduis donc que cette fonction me permet de chercher dans une phrase (chaine de caractères) si mot est contenu dans un tableau.
C'est bien ce que je souhaite faire.

strpos — Cherche la position de la première occurrence dans une chaîne
Je ne cherche pas à savoir quel est le numéro (position d'un mot) contenu dans un tableau.

Si mon erreur est de ne pas utiliser la bonne fonction, pourquoi dans cette dernière, on parle de récupération de "position de la première occurrence" ? Je ne vois pas le rapport... #-o

Mammouth du PHP | 1572 Messages

12 juil. 2019, 14:39

Non tu comprends la fonction de travers.

in_array cherche à savoir si la valeur d'une variable se trouve dans le tableau. la variable peut être une chaine de caractère, et dans ce cas la casse sera prise en compte, cela veut dire que
in_array("un",["un","deux","trois"]); => True
in_array("Un",["un","deux","trois"]); => False
mais il faut que ta chaine de caractère correspondent à tous l'élément du tableaux
ainsi
in_array("deu",["un","deux","trois"]); => False


après tout dépends de ce que tu veux obtenir, si tu veux savoir si chaque mot de ton tableaux se trouve dans ta phrase, il te faudra utiliser strpos dans une boucle.
strpos te donnera en effet la position de cette chaine, tu peux ne pas en avoir besoin mieux vaut trop que trop peu. Comme la doc le mentionne strpos retourne False si rien n'est trouvé et php considèrera tous les entiers sauf 0 comme True. donc tu peux imaginer un if (strpos("Ce mec est sympa","sympa")) qui se déclenchera peut importe le résultat de ton strpos. mais avec if (strpos("Ce mec est sympa","Ce")) cela ne marchera pas car Ce est en position 0 donc un if(0) équivaut à if(False).
La solution est de vérifier que strpos n'est strictement pas égal à False if (strpos("Ce mec est sympa","sympa") !== False) remarque le double égale en plus du !

Si tu veux savoir si ta phrase contient au moins un des mots de la phrase, tu peux le faire avec une boucle et ne pas te soucier de savoir de quelle mot il s'agit.
mais je proposerai potentiellement une tout autre voie.
!empty(array_intersect($tableau,explode(" ",$chaine)));
Ces 3 fonctions vont travailler de concert :
explode divise la chaine en un tableau de mot
array_intersect cherche les "mots" commun au 2 tableaux
empty check si la tableau résultant est vide
! inverse le résultat pour retourner True si au moins un mots du tableaux se trouve dans chaine et false dans les autres cas.

mais attention dans ce cas là par exemple "ennuie" ne se trouvera pas dans la phrase "on s'ennuie ici" car c'est le mot "s'ennuie" qui est présent. strpos sera plus indiqué.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Eléphanteau du PHP | 20 Messages

12 juil. 2019, 16:36

Oulala, dur dur, j'ai pas tout compris... :shock:
Désolé si je suis long à la détente...

1) Est-ce que je confonds chaîne de caractères et phrase ? (dans ce cas, effectivement, je ne peux obtenir qu'un False en résultat).
2) Oui, c'est ce que je veux faire...
Si tu veux savoir si ta phrase contient au moins un des mots de la phrase, tu peux le faire avec une boucle et ne pas te soucier de savoir de quelle mot il s'agit.
3) J'avais déjà vu la fonction explode, pour obtenir ce que je souhaitais mais n'avais pas trouver comment faire pour l'utiliser dans mon cas...
4) Oui, ça je l'avait déjà bien assimilé ( différent se note !== ) :wink:

Pour conclure, j'ai donc utiliser avec vos conseils : (je précise à bon entendeur que ma variable $phrase peut-être récupérer d'un formulaire par exemple, histoire de filtrer...)

Code : Tout sélectionner

<?php $mots = ['cool','sympa','gentil']; $phrase = "Ce mec est sympa"; $tab = explode(" ",$phrase); if (empty(array_intersect($mots,$tab))) { echo "<br>"; echo "Cette phrase ne contient pas un mot du tableau."; } else { echo "<br>"; echo "Cette phrase contient un mot du tableau."; } ?>
J'espère que ce post va en aider plus d'un car franchement, c'est pas si limpide que ça quand on lit les infos sur php.net

Merci beaucoup pour votre aide, ces informations m'ont fait comprendre beaucoup de choses.