Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/01/2011, 20h11   #1
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
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 :
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.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 21h09   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Bonjour,

Pour suivre l'ordre de préférence tu as if () elseif () elseif ()...
Cela donnerait :
Code :
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); 
}
 
?>
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2011, 21h14   #3
Membre chevronné
 
Avatar de micetf
 
Homme Fred
Professeur des Ecoles
Inscription : mai 2009
Messages : 503
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : mai 2009
Messages : 503
Points : 701
Points : 701
Essaye ceci :
Code :
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 :
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
micetf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2011, 09h42   #4
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
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 :
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 :
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 :
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 ?
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2011, 22h13   #5
Membre chevronné
 
Avatar de micetf
 
Homme Fred
Professeur des Ecoles
Inscription : mai 2009
Messages : 503
Détails du profil
Informations personnelles :
Nom : Homme Fred
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : mai 2009
Messages : 503
Points : 701
Points : 701
Il y a peut-être mieux, mais voici une proposition :
Code :
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
micetf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 08h53   #6
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Merci beaucoup ! je vois que tu manies toujours très bien les tableaux.
Je te souhaite une bonne journée.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h16.


 
 
 
 
Partenaires

Hébergement Web