Recherche d'un mot dans le désordre.

woodish Messages postés 15 Date d'inscription lundi 9 mai 2011 Statut Membre Dernière intervention 25 mai 2011 - 23 mai 2011 à 12:27
woodish Messages postés 15 Date d'inscription lundi 9 mai 2011 Statut Membre Dernière intervention 25 mai 2011 - 25 mai 2011 à 03:16
Bonjour,
Je cherche à créer une page en PHP pour une recherche d'un mot dans un tableau ($mots) à partir quelques lettres dans le désordre posté dans un formulaire.

J'ai pensé à plusieurs solutions comme:
1/utilisé les expressions régulières du type "[abc]": chaîne qui contient un "a", un "b", ou un "c"
2/découper la chaîne ($_POST['lettres_user']) en caractères, placer ces caractères dans un tableau neutre et comparer les 2 tableaux par l'occurence des mots.

3/La 3ème solution me paraît meilleur depuis que j'ai découvert : count_chars

Voilà où j'en suis dans le code :



<form action="test.php" method="post">


</form>

<?php

$mots = array('pirate','voile','bateau','canon'); 

if (isset($_POST['lettres_user']))//si quelque chose est posté
{

$lettres_user = htmlentities ($_POST['lettres_user'], ENT_QUOTES);

     

for($i=0;$i<sizeof($mots);$i++){//pour tout les mots du tableaux

    foreach (count_chars($_POST['lettres_user'], 1) as $a => $val_user){//rechercher occurence des lettres de lettres_user
 
foreach (count_chars($mots[$i], 1) as $b => $val_mots){//rechercher occurence des lettres des mots
  
  	if ( ($val_mots $val_user) && ( chr($b) chr($a) ) ){//condition d'égalité des recherches
 
echo $mots[$i].'
';
}}}}}
?>




si je poste "v" , ça retourne bien "voile"
si je poste "p" , ça retourne bien "pirate"
si je poste "b" , ça retourne bien "bateau"
si je poste "i" , ça retourne bien "voile" et "pirate"
si je poste "aa" , ça retourne bien "bateau"
mais...
si je poste "oi" , ça retourne "pirate" "voile" "voile" "canon"
si je poste "pitr" , ça retourne "pirate" "pirate" "pirate" "pirate" "voile" "bateau"

là ! je pige pas !???
Visiblement la recherche se fait lettres par lettres d'où la répétion et les mots qui ne sont pas sensés sortir.
A voir également:

2 réponses

woodish Messages postés 15 Date d'inscription lundi 9 mai 2011 Statut Membre Dernière intervention 25 mai 2011
25 mai 2011 à 01:06
J'ai trouvé une solution ! mais je ne sais pas comment l'écrire.
mon code retourne plusieurs fois une même réponse : normal car il compare lettre par lettre.

pour "bate"

il trouve 3*pirate, 1*voile, 4*bateau et 1*canon

Il suffit d'insérer les réponses dans un tableau $rep=array()
puis de sortir les mots de $rep qui ont autant d'occurence que de caractère dans le mot posté.
et hop !
C'est une solution qui répare un bug mais ça devrait fonctionner.

mon soucis est comment insérer les réponses dans le tableau $rep=array() ??
woodish Messages postés 15 Date d'inscription lundi 9 mai 2011 Statut Membre Dernière intervention 25 mai 2011
25 mai 2011 à 03:16
je n'arrive pas à insérer les réponses dans le tableau.
Voilà comment je tente l'affaire :


<form action="lettrestest.php" method="post">


</form>

<?php

$mots = array('pirate','voile','bateau','canon','a'); 

$rep = array();

if (isset($_POST['lettres_user'])){//si quelque chose est posté

foreach ($mots as $reponses){//les réponses se trouvent dans $mots

$lettres_user = htmlentities ($_POST['lettres_user'], ENT_QUOTES);

for($i=0;$i<sizeof($mots);$i++){//pour tous les mots du tableaux

    foreach (count_chars($_POST['lettres_user'], 1) as $a => $val_user){//rechercher occurence des lettres de lettres_user
 
foreach (count_chars($mots[$i], 1) as $b => $val_mots){//rechercher occurence des lettres des mots
 
if ( $val_mots == $val_user ){//même occurence

if ( chr($b) == chr($a) ){//...pour une même lettre

$rep[] = $reponses;

    }}}}}}}

for($z=0;$z<sizeof($rep);$z++){//afficher les réponses

echo $rep[$z].'
';
}	

?>






Je dois me planter qqpart car ça ne donne plus les mêmes résultats.
pour "bate"
le résultat est desormais 9*chaque mot
là je ne comprends absolument pas ce qu'il me retourne ??
Rejoignez-nous