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

woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention - 14 mai 2011 à 23:27 - Dernière réponse : woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention
- 23 mai 2011 à 12:29
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 ?
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
mailliam 261 Messages postés mardi 2 juillet 2002Date d'inscription 10 mars 2014 Dernière intervention - 19 mai 2011 à 15:15
3
Merci
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++

Merci mailliam 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de mailliam
Meilleure réponse
mailliam 261 Messages postés mardi 2 juillet 2002Date d'inscription 10 mars 2014 Dernière intervention - 20 mai 2011 à 20:57
3
Merci
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!

Merci mailliam 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de mailliam
mailliam 261 Messages postés mardi 2 juillet 2002Date d'inscription 10 mars 2014 Dernière intervention - 16 mai 2011 à 17:04
0
Merci
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
Commenter la réponse de mailliam
woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention - 18 mai 2011 à 23:21
0
Merci
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é.
Commenter la réponse de woodish
woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention - 20 mai 2011 à 18:51
0
Merci
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 ?
Commenter la réponse de woodish
woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention - 20 mai 2011 à 20:29
0
Merci
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
 }
}

?>

Commenter la réponse de woodish
mailliam 261 Messages postés mardi 2 juillet 2002Date d'inscription 10 mars 2014 Dernière intervention - 20 mai 2011 à 21:03
0
Merci
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
Commenter la réponse de mailliam
woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention - 20 mai 2011 à 22:51
0
Merci
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
Commenter la réponse de woodish
woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention - 21 mai 2011 à 20:06
0
Merci
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
Commenter la réponse de woodish
woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention - 22 mai 2011 à 17:36
0
Merci
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 ?
Commenter la réponse de woodish
woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention - 22 mai 2011 à 18:28
0
Merci
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 ?
Commenter la réponse de woodish
woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention - 22 mai 2011 à 18:49
0
Merci
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à
Commenter la réponse de woodish
woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention - 22 mai 2011 à 19:45
0
Merci
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].'
';
                                    }
}
  }
}	
  } 
}
?>

Commenter la réponse de woodish
woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention - 22 mai 2011 à 20:08
0
Merci
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].'
';
}}}}}
?>

Commenter la réponse de woodish
mailliam 261 Messages postés mardi 2 juillet 2002Date d'inscription 10 mars 2014 Dernière intervention - 23 mai 2011 à 05:58
0
Merci
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
Commenter la réponse de mailliam
woodish 15 Messages postés lundi 9 mai 2011Date d'inscription 25 mai 2011 Dernière intervention - 23 mai 2011 à 12:29
0
Merci
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
Commenter la réponse de woodish

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.