Recherche d'un mot dans une liste [Résolu]

Signaler
Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011
-
Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011
-
Bonjour,
je suis absolument débutant en PHP mais je m'arrache les cheveux pour aboutir à mon projet.

J'ai créé un forum pour les membres d'une alliance d'un jeu de pirate.
Dans ce jeu il existe une chasse au trésors : on y récolte des lettres et un nombre qui est le nombre de lettres du mot à trouver.

Je tente de créer une page en PHP.
le but étant de faciliter la recherche des membres de mon alliance grâce à une liste de mots déjà trouvés.

Alors ça fait un moment que je tente plusieurs code mais pfffffff quelle prise de tête.

J'ai tout d'abord pensé à créer un tableau :
$mots = array('pirate','voile','bateau','canon');

pour la recherche du membre il me semble qu'il faut :
echo <<<FORM
<form method="post">


</form>
FORM;

1ère question que je me pose avant même de créer le contenu essentiel, je ne sais pas si pour la recherche du nombre de lettre je peux réutiliser le même <form method="post">
le type="text" concerne réellement que le texte ou les utilsateurs pourront y insérer un chiffre (je sais, c'est une question d'ultra débutant :))

pour le contenu je me suis penché sur les conditions avec "if"
cette structure me paraît intéressante, non ?
if ((condition1)$$(condition2)) {}
else{}

Pour le nombre de lettre je tente d'utiliser "strlen". Je trouve pleins d'exemples sur le net mais je peine à le mettre en pratique pour mon cas.
Comment chercher le nombre de lettres de chaque élément d'un array ?

Avant de continuer plus loin j'aimerais connaître votre avis. Est-ce que je fais fausse route dans un 1er temps ?

16 réponses

Messages postés
261
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
10 mars 2014
2
Tcho, dslé du temps de réponse,

Alors le formulaire .html qui demande le nombre de lettre:
<form action="formulaire.php" method="post">


</form> 


puis la page formulaire.php, où tu n'as qu'à mettre une condition IF:

<?php
//déclaration de la variable $nb_user qui vient du formulaire
$nb_user = htmlentities ($_POST['nb_user'], ENT_QUOTES);

for($i=0;$i<sizeof($mots);$i++)
{
 $nb_lettre = strlen($mots[$i]); //nombre de lettre dans $mots[0] [1] ...
 if ($nb_lettre $nb_user) //$nb_user 4 dans ton exemple
 {
 echo $mots[$i].'
'; //affichage du mot si $nb_lettre = nb_user
 }
}
?>


Bon j'y mets comme cela, j'ai rien testé..
A++
Messages postés
261
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
10 mars 2014
2
Re,

oui tu peux tout à fait faire qu'un seul fichier.php et mettre le code html dans ta page php.
Disons que ta page s'appelle index.php ton formulaire devra renvoyer la variable $nb_user sur la même page (index.php)

par contre je pense que ton erreur se produit car tu déclare une variable ($nb_user) qui n'a pas été envoyée par le formulaire lors du 1er chargement..

ca donnerait qque chose comme ca pour ta page index.php

<html>
<?php
//tu peux la déclarer comme ca, de cette facon lors du 1er chargement il n'y a pas d'envoi de variable donc pas d'éxecution de script:
if (isset($_POST['nb_user'])) // Si la variable existe:
{

$nb_user = htmlentities ($_POST['nb_user'], ENT_QUOTES); //empeche le langage html et les apostrophes par sécurité

for($i=0;$i<sizeof($mots);$i++)
{
 $nb_lettre = strlen($mots[$i]); //nombre de lettre dans $mots[0] [1] ...
 if ($nb_lettre $nb_user) //$nb_user 4 dans ton exemple
 {
 echo $mots[$i].'
'; //affichage du mot si $nb_lettre = nb_user
 }
}

}
?>



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


</form> 
</html>


Là il ne doit plus y avoir d'erreur, dis moi au cas où, car je n'ai rien testé..
Bonne prog!
Messages postés
261
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
10 mars 2014
2
Tcho,

J'ai pas testé mais ca me paraît pas faux avec strlen, genre:

$mots = array('pirate','voile','bateau','canon'); 
echo $mots[0]; //affiche pirate

$nb_lettre = strlen($mots[0]); //affiche le nb de lettre du mot 'pirate' donc 6

puis tu affiche la liste des mots trouvés ainsi que les nb de lettres:
echo 'mot: '.$mots[0].' avec '.$nb_lettre.' lettre(s)'; //affiche "mot: pirate avec 6 lettre(s)"

et tu fais une boucle while pour afficher tout le tablo array
Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011

Merci !
Seulement cette méthode n'affichera t-elle pas tout les éléments du tableau ?
Je souhaite que les utilisateurs demande d'afficher les mots du tableau qui ont un certain nombre de lettres.
Imaginons que l'utilisateur poste le chiffre 4.

J'ai trouvé cette boucle 'for' qui affiche tous les éléments du tableau :
<?php
$mots = array('pirate','voile','bateau','canon');

for($i=0;$i<sizeof($mots);$i++)
{
echo $mots[$i].'
';
}
?>

Comment afficher seulement les éléments de 4 caractères ?
J'aimerai intégrer dans ce code: "$post" qui sera le nombre de lettres désiré.
Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011

TU - ES - UN - CHEF !
MERCI BEAUCOUP !

J'avais écris des lignes similaires en utilisant "if"
mais je déclarais ( $nb_lettre = strlen($mots[$i]); ) avant la boucle "for"
Je ne comprends pas vraiment pourquoi ça ne marche pas en le déclarant avant ?
Mais bon dans tous les cas ton code fonctionne !

J'aimerai résoudre un détail avant de continuer.
Lorsqu'on poste un chiffre et qu'on envoie, on passe de la page .html à la page .php
Du coup, le formulaire de recherche disparaît.
J'ai coller l'html dans la page .php au dessus du code <?php
grâce à cela le formulaire reste actif tout le temps.

Mais lorsque je supprime la page .html, la page .php ne fonctionne plus.
Question bête :
l'html étant dans la page .php, à quoi sert la page .html ?
Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011

J'ai réécris de la sorte. Ca fonctionne mais il y a tt de même un message d'erreur de départ sur cette ligne :
$nb_user = htmlentities ($_POST['nb_user'], ENT_QUOTES);
Après avoir valider, le message d'erreur disparaît


<?php

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


// formulaire HTML
echo <<<FORM
<form method="post">


</form>
FORM;


//déclaration de la variable $nb_user qui vient du formulaire
$nb_user = htmlentities ($_POST['nb_user'], ENT_QUOTES);

for($i=0;$i<sizeof($mots);$i++)
{
 $nb_lettre = strlen($mots[$i]); //nombre de lettre dans $mots[0] [1] ...
 if ($nb_lettre $nb_user) //$nb_user 4 dans ton exemple
 {
 echo $mots[$i].'
'; //affichage du mot si $nb_lettre = nb_user
 }
}

?>

Messages postés
261
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
10 mars 2014
2
ahh encore un truc, regarde sur le site du zéro qui vraiment bien pour commencer (www.siteduzero.com) pour connaître la structure des fichiers
<html>
<head>
<title>XXX</title>
</head>


ton code html

<?php
echo 'ton code php';
?>

ton code html

<?php
echo 'ton code php';
?>

...

</html>


c'est que la base, y a bcp de chose qu'on peut ajouter
Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011

yes ! ça marche. Il manque juste le tableau array dans le code.

Le : if (isset($_POST['nb_user'])) // Si la variable existe

me paraît logique. mais fallait y penser.

Pour le site du zéro...c'est par là que j'ai commencé.
Mais j'ai besoin de refaire un tour et commencer à me faire des fiches !

Je posterai certainement des questions par la suite.
Mais avant tout il faut que j'essaie tout seul.
Je pense que je vais perdre encore des cheuveux ce soir.

Merci beaucoup Mailliam
Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011

Je me consacre désormais à la recherche des mots du tabeau qui contiennent les lettres du ($_POST['lettres_user']).
Le soucis majeur, c'est que l'utilisateur doit pouvoir trouver des mots du tableau en postant seulement quelques lettres et dans le désordre !
J'ai pensé à 2 solutions. Qu'en pensez-vous ?

SOLUTION 1/
je cherche à écrire une expression régulière qui correspond à :
chaîne qui contient un "a", un "b" ET un "c"

C'est ceci qui m'a donné l'idée mais le "ou" me dérange :
"[abc]": chaîne qui contient un "a", un "b", ou un "c"
"(a|b)*": chaîne qui contient une suite de "a" ou de "b"
"abc{2}": chaîne qui contient "ab" suivie de deux "c" ("abcc"

Peut-être ai-je mal compris et le "ou" correspond à un "et"
manque à résoudre le problème d'occurence des lettre (peut-être avec "[a{n}]")
Si c'est possible je continu dans cette direction.

SOLUTION 2/
Si ce n'est pas possible,
je pense qu'il va falloir:
1.découper la chaîne ($_POST['lettres_user']) en caractères.
2.placer les caractères dans un tableau
3.comparer les tableaux 1 et 2 par l'occurence des caractères
Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011

HEY HEY HEY !!!
J'ai réussi à écrire ceci :

[b]<?php
$POST_lettres_user = "ate";
$mots = array('pirate','voile','bateau','canon');

foreach (count_chars($POST_lettres_user, 1) as $i => $val) {
echo "Il y a $val occurence(s) de "" , chr($i) , "" dans " , $POST_lettres_user , "
";
}

echo "
","
";

foreach (count_chars($mots[0], 1) as $i => $val) {
echo "Il y a $val occurence(s) de "" , chr($i) , "" dans " , $mots[0] , "
";
}
?>/b

ça retourne :
[b]Il y a 1 occurence(s) de "a" dans ate
Il y a 1 occurence(s) de "e" dans ate
Il y a 1 occurence(s) de "t" dans ate


Il y a 1 occurence(s) de "a" dans pirate
Il y a 1 occurence(s) de "e" dans pirate
Il y a 1 occurence(s) de "i" dans pirate
Il y a 1 occurence(s) de "p" dans pirate
Il y a 1 occurence(s) de "r" dans pirate
Il y a 1 occurence(s) de "t" dans pirate/b


Il ne me manque plus qu'à comparer "$POST_lettres_user" et "$mots[$i]" avec une condition "if" !
Qu'en pensez-vous ?
Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011

J'ai fait un test. J'imagine que c'est un truc comme ça mais pour le moment ça ne fonctionne pas.
J'ai pensé qu'il était nécessaire de différencier les $i et $val par $i_mots et $i_user.
Et pour la structure du code bah...ouais c'est de l'expérimental


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


</form>

<?php

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

if (isset($_POST['lettres_user']))
{

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

     
foreach (count_chars($POST_lettres_user, 1) as $i_user => $val_user)
  {	 
foreach (count_chars($mots[$i], 1) as $i_mots => $val_mots)
{
  for($i_mots=0;$i_mots<sizeof($mots);$i_mots++)
  {
    if (($val_mots $val_user)&&(chr($i_mots) chr($i_user)))
        {
 echo $mots[$i_mots].'
';
        }
  }
}
  }	  	
 
?>




Une petite idée ?
Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011

il faut enlever "maxlength=2"
il manque un "}" pour fermer le 1er "if"
il faut remplacer le "$POST_lettres_user" par "$_POST['lettres_user']"

ça ne marche toujours pas mais ce sont des fautes qui m'empêchais de voir où ça ne colle pas.

l'erreur est sur le 1er "foreach" donc je pense sur tout ce qui suit.
Ma structure est mauvaise, c'est sûr.
mais je pense que l'idée est là
Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011

voilà le code réécris. je n'ai pas de message d'erreur, ce qui veut dire que la syntaxe est bonne (voilà déjà un progrès pour ma part)
mais le résultat c'est pas ça du tout.
quand je tape une lettre qui n'est pas dans la liste de mot, rien ne s'affiche (ça c'est bon)
mais quand je tape "pi" ou "t" ou quoique ce soit qui se trouve dans un mot du tableau, il retourne la liste du tableau (voir m^me en double des fois)


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


</form>

<?php

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

if (isset($_POST['lettres_user']))
{

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

     
foreach (count_chars($_POST['lettres_user'], 1) as $a => $val_user)
  {	 

  	for($i=0;$i<sizeof($mots);$i++){
foreach (count_chars($mots[$i], 1) as $b => $val_mots)
    {	 
  
  	  for($i=0;$i<sizeof($mots);$i++)
  {
    if ( ($val_mots $val_user) && ( chr($b) chr($a) ) )
        {
 echo $mots[$i].'
';
                                    }
}
  }
}	
  } 
}
?>

Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011

je progresse tout seul c'est cool !
bah oui je suis débutant donc je me réjouis.

J'ai restructuré le code.
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"
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 !???


<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].'
';
}}}}}
?>

Messages postés
261
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
10 mars 2014
2
Coucou!

Désolé de ne pas avoir pu te répondre! je vais essayer de me pencher sur ton code aujourd'hui si j'ai du temps, sinon fais un nouveau post sur le forum, tu auras surement qqun pour t'aider
Messages postés
15
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
25 mai 2011

ok merci !
C'est vrai que ça devient vite bordélique un sujet.
La suite pour les mots dans le désordre se trouve ici :

http://www.phpcs.com/forum/sujet-RECHERCHE-MOT-DANS-DESORDRE_1523538.aspx