IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Une boucle et des conditions [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut Une boucle et des conditions
    Bonjour à tous,

    Je ne parviens pas à articuler mon code logiquement, sachant que j'ai une boucle dans laquelle passent des ID de produits. Pour chacun d'entre eux, 3 types de remises peuvent s'appliquer, mais pas se cumuler. Et je dois respecter un ordre de priorité des remises :

    - La remise "code-promo" prime sur les 2 autres
    - La remise "promoprod" prime sur la dernière
    - La remise "promocat" ne s'applique que si aucune n'a été appliquée.

    Mais rien n'empêche que 3 produits soient dans le panier et que chacun ait une des trois remises. L'important, c'est le non-cumul pour un même produit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     
    foreach( $tab as $id_prod=>$prix){
     
       if(is_code_promo($id_prod)){
     
           $remise = is_code_promo($id_prod);
           $prix = applique_remise($prix, $remise);
     
      }else{
     
             if(is_promoprod($id_produit))
            {
     
                 $remise = is_promoprod($id_prod);
                 $prix = applique_remise($prix, $remise);
     
             }else{
                    if(is_promocat($id_prod))
                    {
     
                        $remise = is_promocat($id_prod));
                        $prix = applique_remise($prix, $remise);
     
                    }
     
             }
        }
    }
    Mais ce code ne fonctionne que si le produit soumis à "code-promo" se présente en 1er dans la boucle. Or je ne connais pas l'ordre des produits.
    Je ne sais pas si j'ai bien expliqué le truc (j'ai beaucoup simplifié) mais si oui, je veux bien une piste sur la façon d'organiser ça.
    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Pour suivre l'ordre de préférence tu as if () elseif () elseif ()...
    Cela donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
     
    foreach($tab as $id_prod => &$prix) {
     
       if (is_code_promo($id_prod)) {
          $remise = is_code_promo($id_prod);
     
        } elseif (is_promoprod($id_produit)) { // il semblerait que tu ais une faute $id_produit != $id_prod
          $remise = is_promoprod($id_prod);
     
       } elseif (is_promocat($id_prod)) {
          $remise = is_promocat($id_prod));
       }
     
       $prix = applique_remise($prix, $remise); 
    }
     
    ?>

  3. #3
    Membre émérite Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Par défaut
    Essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?php 
    function is_code_promo($id) 
    {
    	return ($id==1) ? 10 : false;
    }
    function is_promoprod($id) 
    {
    	return ($id==2) ? 20 : false;
    }
    function is_promocat($id) 
    {
    	return ($id==3) ? 30 : false;
    }
    function applique_remise($prix, $remise) 
    {
    	return $prix-$remise;
    }
     
    $tab=array(100,100, 100);
     
    foreach( $tab as $id_prod=>$prix){ 
    	if(is_code_promo($id_prod)){
    	   $remise = is_code_promo($id_prod);
    	   $prix = applique_remise($prix, $remise);
    	   continue;
    	}
    	if(is_promoprod($id_prod)) {
    		$remise = is_promoprod($id_prod);
    		$prix = applique_remise($prix, $remise);
    		continue;
    	}
    	if(is_promocat($id_prod))
    	{
    		$remise = is_promocat($id_prod);
    		$prix = applique_remise($prix, $remise);
    		continue;
    	}
    }
    echo '<pre>';
    var_dump($tab);
    echo '</pre>';
    ça devrait t'aider à comprendre ton problème :
    Tu verras que aucun des prix n'est changé.
    Dans ta boucle $prix contient bien $tab[$id_prod], mais dans une zone mémoire différente ce qui fait que lorsque tu appliques ta remise à $prix, cela n'affecte en rien le contenu du tableau.
    PUIS regarde et essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    foreach( $tab as $id_prod=>$prix){ 
    	if(is_code_promo($id_prod)){
    	   $remise = is_code_promo($id_prod);
    	   $tab[$id_prod] = applique_remise($prix, $remise);
    	   continue;
    	}
    	if(is_promoprod($id_prod)) {
    		$remise = is_promoprod($id_prod);
    		$tab[$id_prod] = applique_remise($prix, $remise);
    		continue;
    	}
    	if(is_promocat($id_prod))
    	{
    		$remise = is_promocat($id_prod);
    		$tab[$id_prod] = applique_remise($prix, $remise);
    		continue;
    	}
    }
    ça devrait résoudre ton problème.

    MiCetF

  4. #4
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour à vous, et merci de vos précieuses indications !

    En fait, j'ai solutionné ce problème avant de voir vos réponses car le suivi email n'a pas fonctionné. Mais finalement, je suis sur le même principe que ce qu'à écrit micetf : je range tout dans un nouveau tableau (id_prod est la clé) dans les ordres de priorité des remises au fur et à mesure ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    $new_tab = array();
     
    if(is_code_promo($id_prod)){
    $remise = is_code_promo($id_prod);
    $tot_remise = $prix - calcule_remise($prix, $remise);
    $new_tab[$id_prod] = array("type_promo"=>"CP", "remise"=>$remise, "tot_remise"=>$tot_remise);
    }
     
    //si le produit n'est pas déjà dans le new_tab pour cause de remise //code-promo et qu'une remise produit peut s'appliquer :
    if(!in_array($id_prod, array_keys($new_tab)) && is_promoprod($id_prod)){
    $remise = is_promoprod($id_prod);
    $tot_remise = $prix - calcule_remise($prix, $remise);
    $new_tab[$id_prod] = array("type_promo"=>"P", "remise"=>$remise, "tot_remise"=>$tot_remise);
    }
    //et pareil pour les remises catégories...
    Le nouveau tableau contient bien les infos que je désire.
    Mais ensuite, hors de la boucle, je souhaite le ré afficher sous forme de synthèse en groupant les montants de remise par type de remise.
    Or, j'ai simulé un exemple ou 2 produits ont une remise code_promo et le 3ème une remise produit : voici le print_r de ce tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    Array
    (
        [189] => Array
            (
                [remise] => 10
                [tot_remise] => 4.6
                [type_promo] => CP
            )
     
        [190] => Array
            (
                [remise] => 10
                [tot_remise] => 9
                [type_promo] => CP
            )
     
        [596] => Array
            (
                [remise] => 25.00
                [tot_remise] => 3.2
                [type_promo] => P
            )
     
    )
    Ma question est donc : comment je peux fusionner les 2 premiers tableaux en se basant sur le fait qu'ils ont une clé commune qui m'intéresse : [type_promo]

    Ce qui donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Array
    (
        [CP] => Array
            (
                [tot_remise] => 13.6
     
            )
     
         [P] => Array
            (
                [tot_remise] => 3.2
     
            )
     
    )
    Passer par un tableau $tmp ?

  5. #5
    Membre émérite Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Par défaut
    Il y a peut-être mieux, mais voici une proposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $tab = array(
    	189 => array('remise' => 10,'tot_remise' => 4.6,'type_promo' => 'CP'),
        190 => array('remise' => 10,'tot_remise' => 9,'type_promo' => 'CP'),
    	596 => array('remise' => 25.00,'tot_remise' => 3.2,'type_promo' => 'P'));
     
    $synthese=array();
    foreach ($tab as $id => $promo) {
    	$synthese[$promo['type_promo']] = (isset($synthese[$promo['type_promo']])) ? $synthese[$promo['type_promo']]+$promo['tot_remise'] : $promo['tot_remise'];
    }
     
    echo '<pre>';
    var_dump($synthese);
    echo '</pre>';
    MiCetF

  6. #6
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Merci beaucoup ! je vois que tu manies toujours très bien les tableaux.
    Je te souhaite une bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Une boucle sur des dates
    Par Nowwis dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 29/08/2009, 11h51
  2. Faire une boucle sur des labels ou textBox
    Par Actarusdu60 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/12/2008, 18h17
  3. Boucle avec des conditions particulières
    Par h_adil dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/05/2008, 18h01
  4. [PHP-JS] Comment créer une boucle avec des headers
    Par djinnwatcher dans le forum Langage
    Réponses: 10
    Dernier message: 17/07/2006, 15h48
  5. Faire une boucle avec des variables vides ?
    Par byloute dans le forum Linux
    Réponses: 5
    Dernier message: 23/02/2006, 09h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo