Créer un tableau de recherche

Fermé
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 - 6 mai 2011 à 12:29
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 - 22 mai 2011 à 20:12
Bonjour,
je suis en train de faire un forum pour une guilde d'un RPG.
on se sert de cette page : https://www.dcode.fr/mots-contenant
pour trouvé des mots codés.

J'aimerai créer un widget sur le forum qui utiliserait cette m^me méthode de recherche mais avec notre propre liste.
En plus clair j'aimerai créer un tableau avec une liste de mot que j'ajouterais au fur et à mesure et une partie recherche pour les utilisateurs.
Les utilisateurs n'auront qu'à donner les quelques lettres dans le désordre qu'ils auront trouvé pendant leur chasse aux trésors + le nombre de lettre (s'ils le savent), puis de lancer la recherche.

Je pensais créer un tableau avec <table>. Mais pour le système de recherche je coince car il faut visiblement que j'intègre du PHP.
Je suis allez voir du côté Le site du Zéro...très pratique pour apprendre les bases du PHP et créer un tableau mais je ne trouve pas mon bonheur mon véritable but.

Je sais...je débute donc j'ai du chemin mais j'ai la motive.
Pourriez-vous m'aiguiller sur mes recherches ?




A voir également:

6 réponses

Utilisateur anonyme
6 mai 2011 à 13:29
Bonjour,

Si je comprends bien vous auriez une liste de mot quelque part et vous voudriez faire une recherche dessus puis afficher les mots qui correspondent ?

Ce code dans ce cas répondra à la recherche large

<?php
// définitation de la liste de mots
$mots = array('chien','chat','loup','canard');

// tableau des réponses
$tab = array();

// recherche lancée
if (array_key_exists('recherche',$_POST)) {
	
	// parcourt de la liste
	foreach($mots as $mot) {
		
		// recherche de l'occurence
		if (($index=strpos($mot,$_POST['recherche']))!==false) {
			
			// ajout au tableau des réponses
			$tab[] = $mot;
		} // recherche de l'occurence
	} // parcourt de la liste
} // recherche lancée

// formulaire HTML
echo <<<FORM
<form method="post">
	<input type="text" name="recherche"/>
	<input type="submit"/>
</form>
FORM;

// affichage du résultat, s'il y en a
if (count($tab)>0) {
	echo '<ul>';
	foreach($tab as $reponse) {
		echo '<li>'.$reponse;
	}
	echo '</ul>';
} // affichage du résultat, s'il y en a

?>
0
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
Modifié par martine et chantal le 7/05/2011 à 04:36
merci neoprog67.
J'aurais dû être plus explicite. Je cherche à créer un tableau avec les cadres "suite de lettres" ET "nombre de lettres" ... et seulement en mode "recherche dans le désordre"

mais merci tout de même... ta réponse m'a permis de me pencher un peu plus dans le PHP.
0
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
7 mai 2011 à 06:06
voilà 7h d'affilée que je me bourre le crâne de PHP.
j'ai finis par comprendre comment fonctionne ton code m^me si certains éléments m'échappent.
comme if (($index=strpos($mot,$_POST['recherche']))!==false)
si je comprends bien c'est là qu'intervient la recherche à partir d'une lettre ou +.
cependant je ne comprends pas l'utilité de !==false

Il reste 2 évolutions à faire dans ce code pour arriver à mon but final :
_faire en sorte qu'on puisse trouver un mot à partir de plusieurs lettres dans le désordre (ex: pour le moment s'il on tape "niech", le mot "chien" n'est pas trouvé)
_intégrer un 2ème critère à la recherche : le nombre de lettre
0
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
Modifié par martine et chantal le 7/05/2011 à 17:58
pour le !==false j'ai eu ma réponse ici : https://stackoverflow.com/questions/699507/why-use-false-to-check-stripos-in-php

J'ai trouvé la fonction strlen pour le nombre de lettres mais je peine à l'intégrer dans le code.

Voilà exactement la page que j'aimerai avoir : http://rawars.info/
0
Utilisateur anonyme
9 mai 2011 à 08:24
strpos($mot,$_POST['recherche'])

renvoie la position du premier caractère $_POST['recherche'] dans la chaîne $mot
si la chaîne $_POST['recherche'] n'existe pas cela renvoie false au lieu d'un nombre, d'où le !==

strln donne la longueur d'une chaîne

strlen('toto')=4

Pour la recherche dans le désordre 'niech' pour 'chien' cela va être beaucoup plus compliqué et surtout très lent. Il va falloir parcourir la chaîne 'niech' lettre par lettre, et vérifier que la lettre existe dans 'chien'

$rep=true;
for($i=0;$i<strlen($_POST['recherche'];$i++) {
if (strpos($mot,substr($_POST['recherche'],$i,1))===false) {
$rep=false;
break;
}
}
if($rep==true) echo 'mot trouvé';


En gros c'est ça sauf que 'tét' répondra ok pour 'été', donc bof... pas simple comme algo
0
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
9 mai 2011 à 12:40
encore merci.
Avant tout j'aimerai revenir sur le strpos($mot,$_POST['recherche']).
tu me dis que ça renvoie la position du premier caractère $_POST['recherche'] dans la chaîne $mot.
Je le comprends comme cela : si je poste "ch", le robot cherche uniquement le premier caractère, en l'occurence "c" dans la chaîne $mot.
Seulement si je poste "ch", la réponse est "chien" et "chat" .... et non "canard".
Donc il utilise l'ensemble des caractères postés.

Pour le strlen, il va falloir que je me gratte encore la t^te :).
A 1ère vu j'aimerai écrire la condition "for" comme ceci :
for($i=strlen($_POST['recherche'])
Mais j'imagine bien que je fais fausse route.

je reviendrai dessus dès ce soir. (Ah si je pouvais emmener mon PC au boulot ! :) )
Pour ma part j'essai d'organiser mes recherches.
J'essaie tout d'abord de créer un code de recherche des mots dans le désordre.
Puis de créer un code de recherche pour le nombre de lettres.
Enfin de tenter de combiner les 2 recherches.

OH ! petite question as-tu un site à me conseiller pour l'apprentissage du PHP.
Je navigue entre "le site du zéro", "PHP.net" et parfois "comment ça marche".
Je pense que c'est déjà pas mal...mais si tu as un site repaire pour toi, je suis preneur.
0
Utilisateur anonyme
9 mai 2011 à 13:02
strpos($mot,$_POST['recherche'])

oui, renvoie la position du premier caractère, à condition que la chaîne existe dans $mot.

une boucle for ne s'écrit pas ainsi mais comme je l'ai mis avant :

for(VALEUR_INITIALE;condition sur VALEUR_MAXIMALE;ITERATION) {
}

for($i=0;$i<strlen($_POST['recherche'];$i++) {

Pour apprendre, le meilleur site reste à mon avis le https://www.php.net/
0
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
9 mai 2011 à 22:28
bon... il faut que je me rende à l'évidence.
si tu trouves que l'algo recherchée est complexe qu'en est-il pour moi ? :(
Ce n'est pas un abandon mais un constat : j'ai du boulot !
0
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
10 mai 2011 à 00:53
hep hep hep...il me reste une solution. trouver un script déjà fait qui correspond plus ou moins à ce que je recherche.
trouver un mot dans une liste à partir de qqs lettres c'est tout bêtement la recherche d'un anagramme !?
"google => code PHP anagramme" donne des pistes intéressantes.
0
Utilisateur anonyme
10 mai 2011 à 07:43
Oui c'est pas mal aussi 8-)
0
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
Modifié par martine et chantal le 15/05/2011 à 02:06
aïe aïe aïe ! quelle prise de tête.
J'efface tout et je recommence.
Je me suis replongé dans les cours de PHP et j'ai tenté de créer le squelette du code que je cherche.

cette base est-elle réalisable ? :

<?php
//liste
$mots = array('chien','chat','loup','canard');

<form method="post"> recherche1
<form method="post"> recherche2

if (
(CONDITION1= le mot crypté (recherche1)contient m^me lettres d'un mot de la liste)
$$
(CONDITION2= le chiffre (recherche2)correspond au nb de lettres d'un mot de la liste) )

{donner la/les réponse}

else {echo "rien trouvé"}
?>
0
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
15 mai 2011 à 02:06
AH ! une autre question :

J'ai trouvé ceci sur le dossier php de comment ça marche :
"[abc]": chaîne qui contient un "a", un "b", ou un "c"
puis-je écrire "[$_POST['recherche']]" ? car ça pourrait être interessant.
0
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
Modifié par martine et chantal le 20/05/2011 à 21:21
problème du nombre de lettres RESOLU ! :

code HTML:
<form action="formulaire.php" method="post">
<input type='text' name='nb_user' size=10 maxlength=2 value=''>
<input type="submit" value="Envoyer">
</form>


code PHP:
<?php
$mots = array('pirate','voile','bateau','canon');

//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)
{
echo $mots[$i].'<br>'; //affichage du mot si $nb_lettre = nb_user
}
}
?>



Par contre j'essaie de l'écrire en une page mais j'ai un bug sur la ligne:
$nb_user = $_POST['nb_user'];
Pourtant ça fonctionne...

code entier:
<body>
<?php

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

// formulaire HTML
echo <<<FORM
<form method="post">
<input type="text" name="nb_user"/>
<input type="submit" value="Envoyer"/>
</form>
FORM;

//déclaration de la variable $nb_user qui vient du formulaire
$nb_user = $_POST['nb_user'];


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

?>
</body>
0
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
Modifié par martine et chantal le 21/05/2011 à 13:20
NOMBRE DE LETTRES DEFINITIVEMENT RESOLU : il me suffisait d'appeler la page index.php
et d'écrire action="index.php".
l'erreur sur la ligne demandais l'existence (ou non) de 'nb_user' grâce à cette ligne :
if (isset($_POST['nb_user'])) // Si la variable existe

CODE:

<form action="index.php" method="post">
<input type='text' name='nb_user' size=10 maxlength=2 value='' />
<input type="submit" value="Envoyer" />
</form>

<?php

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

//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)
{
echo $mots[$i].'<br />'; //affichage du mot si $nb_lettre = nb_user
}
}

}
?>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
21 mai 2011 à 20:14
message adressé à tout le monde:

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"

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

neoprog67 pense à une 3ème SOLUTION/
mettre les mots du tableau et de ($_POST['lettres_user']) dans l'ordre alphabétique.
Seulement j'ai peur que ça ne fonctionne pas :
si je poste "arn" la recherche se fera avec "anr"
le mot "canard" ne sortira pas car il s'écrira "aacdnr"
0
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
22 mai 2011 à 17:37
HEY HEY HEY !!!
J'ai réussi à écrire ceci :

<?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 , "<br>";
}

echo "<br>","<br>";

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




ça retourne :

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



Il ne me manque plus qu'à comparer "$POST_lettres_user" et "$mots[$i]" avec une condition "if" !
0
martine et chantal Messages postés 485 Date d'inscription dimanche 15 février 2009 Statut Membre Dernière intervention 4 juin 2013 4
Modifié par martine et chantal le 22/05/2011 à 20:40
Voilà où j'en suis :

Code PHP :
<body>

<form action="test.php" method="post">
<input type='text' name='lettres_user' size=10 value='' />
<input type="submit" value="Envoyer" />
</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 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) && ( chr($b) == chr($a) ) ){//condition d'égalité des recherches

echo $mots[$i].'<br />';
}}}}}
?>

</body>



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 !???
0