Page 1 sur 1

Fonction ne prenant pas en compte une boucle

Posté : 30 oct. 2013, 10:39
par leknol
Bonjour à tous, je viens vous demander un petit coup de main pour comprendre pourquoi dans cette fonction ma boucle for me fonctionne pas, cette fonction doit déterminer si un "mot" donné en argument est au pluriel ou non.

Mon problème est lors de la boucle for, la valeur du mot "toujours au pluriel" ne change pas (comme présenté dans le script ci dessous) Comme sur le screen ci-dessous ou l'ont voit que la valeur du $mots_toujours_pluriels[$i] est toujours la même, même avec la boucle for sensé effectuer un tour complet du tableau :?

Image

Merci par avance pour votre piste :wink: :!:
function mot_pluriel($txt){
	$mots_toujours_pluriels = array(
	"Abcès",
	"Discours",
	"Ailleurs",
	"Archives",
	"Jamais",
	"Abus",
	"Remous",
	"Agissements",
	"Alors",
	"Canevas",
	"Revers",
	"Appointements",
	"Longtemps",
	"Chaos",
	"Héros",
	"abois",
	"Certes",
	"Compas",
	"Jus",
	"aguets",
	"Moins",
	"Marais",
	"Velours",
	"environs",
	"Dehors",
	"Mets",
	"Talus",
	"confins",
	"Parfois",
	"Parcours",
	"Mois",
	"Décombres",
	"Dessous",
	"Poids",
	"Doléances",
	"Puis",
	"Compas",
	"Frais",
	"Dessus",
	"Concours",
	"Funérailles",
	"Quelquefois",
	"printemps",
	"Fiançailles",
	"Désormais",
	"Cours",
	"Pourparlers",
	"Toujours",
	"Décès",
	"Représailles",
	"Exprès",
	"Puits",
	"ténèbres",
	"Volontiers",
	"Corps",
	"Jadis",
	"Relais",
	"Fois",
	"Gens");
	$last_occurence = substr($txt, -1);
	for($i=0;$i < sizeof($mots_toujours_pluriels);$i++){
		if(strtolower($txt) != strtolower ($mots_toujours_pluriels[$i])){//suppresion des "s"
				if($last_occurence == "s"){
						echo "<p>[".$txt."] doit être different de[".$mots_toujours_pluriels[$i]."]</p>	";
						$txt_end = substr($txt,0,strlen($txt)-1);
						$txt_end = removeAccents($txt_end);
						// echo "<BR />Le mot est maintenant egal a : [".$txt_end."]<BR /><BR />";
						return $txt_end;
					}
					else{
						$txt_end = $txt;
						return $txt_end;
					}
				
			
		}	

	}

}

Re: Fonction ne prenant pas en compte une boucle

Posté : 30 oct. 2013, 12:22
par Mazarini
Dans la ligne :
if(strtolower($txt) != strtolower ($mots_toujours_pluriels[$i]))
Pour $i = 0, $txt est différent de abces (a moins de passer abces comme parametre) et tu fais toujours un return si $txt se termine pas un s
Donc tu ne va pas plus loin.

Par contre, je ne comprend pas ce que tu veux faire. Pour moins c'est un problème d’algorithme.

Edit, je vois plus un truc comme ca :

Code : Tout sélectionner

Si le paramètre se termine par un "s" Si le paramètre est dans le tableau retourner ? sinon retourner ? sinon Si le paramètre + un "s" est dans le tableau retourner ? sinon retourner ?
(je te laisse chercher la fonction qui permet de voir si une valeur est dans un tableau)

Re: Fonction ne prenant pas en compte une boucle

Posté : 30 oct. 2013, 13:07
par sirakawa
<?PHP
/*Je suppose que le but de la fonction de refuserf l'emploi d'un mot faisant partie de la liste*/
function mot_pluriel($txt)
{
/*Cette fonction rendra un résultat aberrant si la dernière lettre est accentuée. Il vaut
mieux passer par mb
*/
mb_internal_encoding ("UTF-8");
/*En-dehors du fait que l'on ne puisse pas dire que les adverbes et les prépositions sont toujours pluriel,
la liste est très incomplète... Agissement existe au singulier
$mots_toujours_pluriels = array(
"Abcès",
"Discours",
"Ailleurs",
"Archives",
"Jamais",
"Abus",
"Remous",
"Agissements",
"Alors",
"Canevas",
"Revers",
"Appointements",
"Longtemps",
"Chaos",
"Héros",
"abois",
"Certes",
"Compas",
"Jus",
"aguets",
"Moins",
"Marais",
"Velours",
"environs",
"Dehors",
"Mets",
"Talus",
"confins",
"Parfois",
"Parcours",
"Mois",
"Décombres",
"Dessous",
"Poids",
"Doléances",
"Puis",
"Compas",
"Frais",
"Dessus",
"Concours",
"Funérailles",
"Quelquefois",
"printemps",
"Fiançailles",
"Désormais",
"Cours",
"Pourparlers",
"Toujours",
"Décès",
"Représailles",
"Exprès",
"Puits",
"ténèbres",
"Volontiers",
"Corps",
"Jadis",
"Relais",
"Fois",
"Gens");
/*la dernière lettre ? Cette fonction rendra un résultat aberrant si la dernière lettre est accentuée. Il vaut
mieux passer par mb*/
$last_occurrence = mb_substr($txt, -1);
print "dernière lettre $last_occurrence";
/*inutile de calculer à chaque itération la longueur du tableau. De plus il vaudrait mieux employer count */
$longueur = sizeof($mots_toujours_pluriels);
for($i = 0 ;$i < $longueur; $i++)
{

if(strtolower($txt) != strtolower ($mots_toujours_pluriels[$i]))//mots différents
{
if($last_occurrence == "s")//$txt se termine par s
/*le traitement suivant est effectué quelle que soit la valeur de txt et la boucle s'arrête dès le
premier mot du tableau.*/

{
echo "<p>[".$txt."] doit être different de[".$mots_toujours_pluriels[$i]."]</p> ";
$txt_end = substr($txt, 0, strlen($txt)-1);
$txt_end = removeAccents($txt_end);
// echo "<BR />Le mot est maintenant egal a : [".$txt_end."]<BR /><BR />";
//puisque dans les deux cas on retourne $txt_end, il vaut mieux avoir un seul point de sortie.
//return $txt_end;
}
else
{
$txt_end = $txt;
}


}

}
return $txt_end;
}
$z = mot_pluriel("mévaisé");
?>

Re: Fonction ne prenant pas en compte une boucle

Posté : 30 oct. 2013, 15:05
par Mazarini
J'ai l'impression que la on va bien parcourir tous le tableau, mais pour faire toujours la même chose.
<?PHP
function mot_pluriel($txt) {
    mb_internal_encoding ("UTF-8");
    $mots_toujours_pluriels = array(...);  // A mettre en minuscule tant qu'à faire...
    $txt = strtolower($txt); 
    if (mb_substr($txt, -1)=='s') {
       $txt2 = $txt;
       $txt = substr($txt, 0, strlen($txt)-1);
    } else {
       $txt2 = $txt.'s';
    }
    if (array_search ($txt2, $mots_toujours_pluriels) !== false) {
//     le mot est dans le tableau on retourne le mot avec le s
        $retour = $txt2;
    } else {
//    le mot n'est dans le tableau on retourne le mot sans le s
        $retour = $txt;
    }
    return removeAccents($retour);
}
?>
C'est ce qui me semble le mieux, mais je ne suis pas sur d'avoir tout compris.

Re: Fonction ne prenant pas en compte une boucle

Posté : 30 oct. 2013, 15:38
par sirakawa
Ca doit être ça:
Même code que Mazarini avec un jeu de tests:
<?PHP
function mot_pluriel($txt) {
     mb_internal_encoding ("UTF-8");
     $mots_toujours_pluriels = array("bois", "buis");  // A mettre en minuscule tant qu'à faire...
     $txt = strtolower($txt); 
     if (mb_substr($txt, -1)=='s') {
        $txt2 = $txt;
        $txt = substr($txt, 0, strlen($txt)-1);
     } else {
        $txt2 = $txt.'s';
     }
     if (array_search ($txt2, $mots_toujours_pluriels) !== false) {
//     le mot est dans le tableau on retourne le mot avec le s
         $retour = $txt2;
     } else {
//    le mot n'est dans le tableau on retourne le mot sans le s
         $retour = $txt;
     }

     return $retour;
}
$z = mot_pluriel("toto");
print "$z";
$z = mot_pluriel("totos");
print "$z";
$z = mot_pluriel("boi");
print "$z";
$z = mot_pluriel("bois");
print "$z";
$z = mot_pluriel("bui");
print "$z";
$z = mot_pluriel("buis");
print "$z";
?>

Re: Fonction ne prenant pas en compte une boucle

Posté : 02 nov. 2013, 13:39
par leknol
Merci beaucoup pour votre retour, j'ai adapté votre et cela fonctionne parfaitement. Sa m'a également permis de voir une autre façon de raisonner :wink: