Plusieurs fois le même test ... comment faire plus light ?

Mammouth du PHP | 545 Messages

16 févr. 2007, 17:05

Bonjour,

J'ai fait une liste de personne que je replace dans une catégorie (ED, EH, SE, DA, V1, A1, ...) en fonction de l'age et du sexe.

J'avais envisagé de faire une fonction JS mais l'on me conseille plus le PHP pour cela.

Voici le code que j'envisage d'utiliser :
<?php
if ($sexe == 'f' || $sexe == 'F'){
    if ($age <= 19){
        $cat = 'ED';
        }else if ($age <= 34){
	        $cat = 'DA';
	}else if ($age <= 44){
		$cat = 'A1';
	}else if ($age <= 54){
		$cat = 'A2';
	}else if ($age <= 64){
		$cat = 'A3';
	}else if ($age <= 74){
		$cat = 'A4';
	}else if ($age <= 84){
		$cat = 'A5';
	}else{
		$cat = '**';
		};
   };

if ($sexe == 'h' || $sexe == 'H'){
   if ($age <= 19) { 
       $cat = 'EH';
       }else if ($age <= 39){
		$cat = 'SE';
	}else if ($age <= 49){
		$cat = 'V1';
	}else if ($age <= 59){
		$cat = 'V2';
	}else if ($age <= 69){
		$cat = 'V3';
	}else if ($age <= 79){
		$cat = 'V4';
	}else if ($age <= 89){
		$cat = 'V5';
		}else{
		$cat = '**';
	};
};
echo $cat;
?>
Est-ce un code correcte ? Etant donné que je compte utiliser plusieurs fois ce code n'y-a-t-il pas un moyen de faire plus ligth en rappelant sous une forme de fonction (style JS) que j'avais stocké sur ma page ? Comment, où et comment en faire l'appel ?

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Eléphant du PHP | 96 Messages

16 févr. 2007, 17:13

Tu peut l'apeller en include genre :
<?php require_once('ta_page_ou_se_trouve_ton_code.php');

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

16 févr. 2007, 17:15

Bah comme en javascript, autant en faire une fonction que tu peux appeller plusieurs fois si les paramètres changent :
function categorie ($age, $sexe) { 
  $cat = '**'; // je donne une valeur par défaut dès le début, ca évite les else ...

  if (strToUpper($sexe) == 'F'){ // strToUpper force la chaine en majuscule
    if ($age <= 19){ 
        $cat = 'ED'; 
    }else if ($age <= 34){ 
        $cat = 'DA'; 
    }else if ($age <= 44){ 
        $cat = 'A1'; 
    }else if ($age <= 54){ 
        $cat = 'A2'; 
    }else if ($age <= 64){ 
        $cat = 'A3'; 
    }else if ($age <= 74){ 
        $cat = 'A4'; 
    }else if ($age <= 84){ 
        $cat = 'A5'; 
    }
    // pas besoin de else, si je ne suis rentré dans aucun if(), $cat a gardé sa valeur initiale '**'

  } // pas de ; après une accolade 
  ...

  return $cat; // retourne le résultat
}
et pour l'appeler, il suffit de lui passer les paramètre qui vont bien et de récupérer la valeur retournée :
$valeur = categorie('F', 30);
echo $valeur; // affiche "DA"
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 259 Messages

16 févr. 2007, 18:36

hello,

ton post m'intéresse parce que je vais avoir à faire un truc du meme acabit d'ici peu.
n'ayant pas php sous le coude là, je te propose le code suivant, écrit en live et non testé. Donc à la limite si tu l'essaye, je te remercierai de me dire s'il fonctionne :p (oui j'admet c'est limite de la pollution mais pas tant que ca quand meme ! )
function getCategorie( $sexe , $age ){
if( $sexe == 'H') $categories = array( 39 => 'ESH' , 49=>'SEH' ..... );
else $categories = array( 34 => 'ESD' , 44 => 'SED' .... );
// parcours des catégories 
foreach( $categories as $key=>$val ){
// on compare l'age à la limite de categorie courante et s'il est supérieur on retourne la valeur correspondant à la clé précédente
if( $age > $key ) return prev( $categories );
}
}
ce code est pas garanti, surtout du coté de l'utilisation de la fonction prev() qui est peut etre pas efficace au sein d'un foreach().
l'intéret de cette méthode est de t'apporter un peu se souplesse si tu dois ajouter des catégories.

désolé pour la présentation du code et pour les tableaux de catégories qu'il va falloir adapter pour ton systeme (je tape ca sur un portable, j'ai pas l'habitude, et c'est super chiant !!).



bon courage !

ViPHP
ViPHP | 3607 Messages

16 févr. 2007, 19:26

@ Ryle:
tu t'es trompé dans l'appel à ta fonction ... :wink: (t'a inversé les paramètres)

Mammouth du PHP | 545 Messages

17 févr. 2007, 00:10

Voilà , j'ai fait les essaies et malheureusement cela fonctionne mais pas comme prévu !

La fonction -> RAS, elle me renvoit bien ce que j'espèrais (Note: Jules Petibidon, j'essaye la tienne ensuite pour voir ce qu'elle reverra !)

Le problème vient de la localisation de la fonction que j'aimerai placer dans un fichier indépendant afin de modifier plus facilement (sans devoir tout lister !)
J'ai placer cette fonction entre des balises <?php ?> dans le fichier societaire.func.php et je fais l'appel mais avec un 'require_once', j'ai lu que cela ne fonctionnait pas avec joomla! (c'est le portail que j'utilise pour afficher mon composant).

Par exemple pour faire l'appel d'une page JavaScript, je dois faire ceci:

Code : Tout sélectionner

<script language="javascript" type="text/javascript" src="<?php echo $url; ?>/components/com_societaire/societaire.js"></script>
Que vais-je devoir faire avec une page .php?

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 545 Messages

17 févr. 2007, 00:17

Non ok, c'est une connerie de ma part pour le 'require_once' ... y'a seulement un petit quelque chose à faire mais cela fonctionne !

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 févr. 2007, 01:32

@jojo : ouais mais euh... en fait non... je m'ai pas planté dans les paramètres, c'est juste que je rentrerais pas dans les if() et que j'aurais une catégorie à '**', et c'est exactement ce que je voulais :langue: (comment ça "faux cul" ? ;))

@julot : c'est vrai que c'est plus classe comme ça, mais je pense que la série de if() prend moins de ressource que boucles et fonctions... enfin ceci dit la différence doit être assez insignifiante.
Pense par contre à commencer ton tableau par l'index 0=>'xx', sinon t'auras pas d'élément précédent si c'est la première tranche la bonne. Et si le prev() ne fonctionne pas dans le foreach(), suffit de conserver la valeur précédente dans une variable temporaire :)

@Sebe : ca ne tient qu'à moi, mais tu devrais plutôt utiliser require (ou include) que require_once. Tu es maitre de ton code, ca coute pas grand chose de faire attention à n'inclure un fichier qu'une seule fois, alors que ça en coute à php de vérifier à chaque fois s'il n'a pas déjà vu passer le fichier que tu requierts :)
Pis si c'est résolu..... ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 259 Messages

17 févr. 2007, 10:57

Bouargh !

@ryle : c'est sur qu'une série de if est surement plus "optimal" en terme de performances. mon optique est plus du coté de la modularité du machin, s'il faut rajouter des catégories par exemple. de plus, j'avoue etre une grosse faignasse, et je préfere faire un code de 4 lignes qui demande un peu plus de travail à php que de faire un code de 70 lignes ultra chiadées qui me feront gagner une demi nano-seconde de traitement :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 févr. 2007, 14:18

Chuis bien d'accord :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...