[RESOLU] Aide fonction strtoupper et strtolower

Arrow9
Invité n'ayant pas de compte PHPfrance

23 déc. 2015, 15:12

Bonjour j'aurais besoin d'aide pour un exercice de php.
Voici l'énoncé "Écrivez une fonction dont le paramètre (passé par référence) est un tableau de chaînes de
caractères et qui transforme chacun des éléments du tableau de manière que le premier
caractère soit en majuscule et les autres en minuscules, quelle que soit la casse initiale des
éléments. Utilisez les fonctions strtoupper et strtolower."


Mon code est
<?php
function MajMin($tab){
	foreach($tab as $key=>$val){
		$maj=substr($val,0,1);
		$tab[$key]=(strtoupper($maj));
		$tab[$key]=(strtolower($val));
	}
return $tab;
}

$tableau=array("fRaNcE","aLlEmAgNe","eSpAgNe");
print_r(MajMin($tableau));
?>
Le problème c'est que quand je le visualise, le strtoupper ne marche pas...
Merci :priere:

Eléphanteau du PHP | 16 Messages

23 déc. 2015, 16:21

Salut,

C'est normal, la valeur de tes éléments de ton tableau est écrasée et correspond donc au strtolower. C'est comme si tu avais fait a = 1 puis a = 2.
Néanmoins, une simple concaténation n'irait pas non plus ici puisque tu te retrouveras avec Ffrance à la fin par exemple. Tu dois exclure le premier caractère de ton lower avant de le concaténer par exemple.

Mammouth du PHP | 1967 Messages

23 déc. 2015, 16:24

$tab[$key]=(strtoupper($maj));
$tab[$key]=(strtolower($val));
Avec ceci, ta deuxième instruction remplace ta première. C'est comme si tu réécrivais sur la même feuille de papier plutot que de la retourner.

tu peux utiliser .= pour concatèner tes chaines de caractère les unes après les autres. Mais tu aura malgré tout une surprise et pas encore le résultat escompté. car la première lettre de chaque chaine sera répété en Majuscule et en minuscule. Je te laisse le soin de chercher le pourquoi ou de revenir avec cette question si tu ne trouve pas.

PS si l'énoncé de l'exercice précise de faire une fonction par référence, il faudrait que tu te renseigne sur la signification de cette instruction car pour l'instant cette fonction n'utilise pas d'argument passé par référence.

Je vois que mon voisin du dessus est d'accords avec moi :D
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Arrow9
Invité n'ayant pas de compte PHPfrance

23 déc. 2015, 16:43

J'ai modifié pour obtenir :
<?php
function MajMin(&$tab){
	foreach($tab as $key=>$val){
		$maj=substr($val,0,1);
		$min=substr($val,1,1000);
		$tab[$key]=(strtoupper($maj));
		$tab[$key].=(strtolower($min));
	}
return $tab;
}

$tab=array("fRaNcE","aLlEmAgNe","eSpAgNe");
print_r(MajMin($tab));
?>
Ça marche, par contre je vois pas ce qui va pas avec la référence...

Eléphanteau du PHP | 16 Messages

23 déc. 2015, 16:54


Mammouth du PHP | 1967 Messages

23 déc. 2015, 17:03

petit plus,
pour cette ligne :
$min=substr($val,1,1000);
le 3ème paramètre est facultatif, et si il est omit, la coupure ira jusqu'à la fin de la chaine.

Des fois que la fonction serait utilisé pour des chaines de plus de 1001 caractères
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Arrow9
Invité n'ayant pas de compte PHPfrance

23 déc. 2015, 17:11

Ok merci !
Et KriSpiX j'ai était voir ce site mais je vois pas ce qu'il y a de différent dans mon code

Mammouth du PHP | 1967 Messages

23 déc. 2015, 17:29

Le passage par référence va travailler sur la variable directement plutot que d'en prendre une copie.
Cela a comme incidence direct, qu'il est inutile de faire un return à la fin de la fonction.
L'autre conséquence (en cascade) c'est comme il n'y a pas de retour, il ne sert à rien de l'enregistrer dans une variable ou de l'imprimer (avec print, echo et consort)
on transforme donc notre tableau comme ceci
MajMin($tab);
et ensuite un print_r $tab;
affichera le tableau modifié.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 16 Messages

23 déc. 2015, 17:31

J'avais pas vu que tu avais rajouté le "&" dans les paramètres. En fait comme tu ne l'avais pas mis au départ et que tu as répondu que tu ne voyais pas le problème... mais en fait si tu as vu le problème puisque tu as corrigé ;)

Je pense que tu as compris la différence entre les deux, même si avec ton print tu ne peux pas le constater.
Fais plutôt ceci, et ainsi on pourra plus facilement constater l'intérêt du passage par référence puisque dans un cas $tab sera modifié et pas dans l'autre.

Code : Tout sélectionner

$tab=array("fRaNcE","aLlEmAgNe","eSpAgNe"); MajMin($tab); print_r($tab);
Également, il reste encore des choses inutiles comme le return puisque l'intérêt est de modifier la variable d'origine.

EDIT : Grilled :mrgreen:

Arrow9
Invité n'ayant pas de compte PHPfrance

23 déc. 2015, 17:34

Ah d'accord...
J'avais compris le principe mais j'avais pas compris comment l'appliquer...
Merci beaucoup !

Mammouth du PHP | 2703 Messages

23 déc. 2015, 17:42

$maj=substr($val,0,1);
plus simplement :
$maj=$val[0];