Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
5241 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  un bon algorithme pour trouver le bon prix

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

un bon algorithme pour trouver le bon prix

n°1491819
freed102
Arayashiki
Posté le 15-12-2006 à 13:58:45  profilanswer
 

voila, j'ai une table... avec 4 niveaux de prix en fonction de la quantité, en resumé...ça donne ça :
 
bo_numint1, bo_numint2, bo_numint3, bo_numint4, bo_numdbl1, bo_numdbl2, bo_numdbl3, bo_numdbl4
 
pour exemple :
pour les quantités j'ai :
bo_numint2=1
bo_numint3=4
bo_numint4=7
bo_numint5=10
 
pour les prix j'ai :
bo_numdbl1=5.5
bo_numdbl2=5.0
bo_numdbl3=4.7
bo_numdbl4=4.3
 
... il va de soit que tout ça est sur la même ligne de la même table donc pas de liaison ou autre
 
dans ce cas là on est bien d'accord que si je choisi si je choisis 1 exemplaire de mon produit il va me couter 5.5€, si j'en prend 5 il va me couter 5.0€ et si j'en prends 8 il va me couter 4.7€ piece.
 
 
l'autre chose à savoir c'est qu'il peut ne pas y avoir forcement 4 niveaux de degressif... par exemple il peut ne pas y en avoir du tout même ! dans ce cas ça donne ça :
 
pour les quantités :
bo_numint2=1
bo_numint3=
bo_numint4=
bo_numint5=
 
pour les prix :
bo_numdbl1=5.5
bo_numdbl2=
bo_numdbl3=
bo_numdbl4=
 
dans ce cas là si je prends 1 exemplaire ou 2, ou 6 ou 100 ou 1000 il me coutera toujours 5.5€
 
 
... jusque là tout va bien !
 
 
la question est surtout :
en PHP... Quelle condition je vais ecrire pour qu'il me prenne toujours la bonne valeur ?
 
ce que j'ai fait :
 

Code :
  1. //ma fonction :
  2. function recalcule_prix_fr($key,$row_tab)
  3. {
  4. if(!empty($row_tab['bo_numint2']))
  5. {
  6. if($_SESSION['panier'][$key]['qte']<=$row_tab['bo_numint2'])
  7. {
  8. $_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl1']);
  9. }
  10. }
  11. if(!empty($row_tab['bo_numint3']))
  12. {
  13. if(($_SESSION['panier'][$key]['qte']>=$row_tab['bo_numint3']))
  14. {
  15. $_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl2']);
  16. }
  17. }
  18. if(!empty($row_tab['bo_numint4']))
  19. {
  20. if(($_SESSION['panier'][$key]['qte']>=$row_tab['bo_numint4']))
  21. {
  22. $_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl3']);
  23. }
  24. }
  25. if(!empty($row_tab['bo_numint5']))
  26. {
  27. if($_SESSION['panier'][$key]['qte']>=$row_tab['bo_numint5'])
  28. {
  29. $_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl4']);
  30. }
  31. }
  32. }
  33. $bo_id=$_SESSION['panier'][$key]['bo_id'];
  34. $query_sz="SELECT * FROM ewb_boutique WHERE bo_id='$bo_id'";
  35. $hcur_re = sql_query( $DBtype_sz, $query_sz, $connect_re );
  36. $row_tab = sql_fetch_array( $DBtype_sz, $hcur_re );
  37. recalcule_prix_fr($key,$row_tab);


 
ma fonction fonctionne presque bien.. sauf que quand j'ai des champs vides dans ma table.. et bien il ne trouve pas mon prix !

mood
Publicité
Posté le 15-12-2006 à 13:58:45  profilanswer
 

n°1491838
skeye
Posté le 15-12-2006 à 14:33:38  profilanswer
 

euh question bête, tu n'as pas essayé de ne sélectionner de base que le bon prix en sql?:o


---------------
Can't buy what I want because it's free -
n°1491839
MagicBuzz
Posté le 15-12-2006 à 14:34:36  profilanswer
 

pour ça faudrait déjà qu'il n'ait pas un modèle des données conçu par un mongolien...

n°1491840
dwogsi
Défaillance cérébrale...
Posté le 15-12-2006 à 14:35:15  profilanswer
 

A mon avis ça aurait été bien plus simple avec une liaison sur une autre table pour gérer les prix par rapport aux quantités. Parce que dans ce cas là tu n'aurais qu'à récupérer le prix pour la quantité max dans celle qui sont inférieur à ta quantité choisie. Et en plus tu ne te retrouverais pas avec des champs vides!

Message cité 1 fois
Message édité par dwogsi le 15-12-2006 à 14:35:56
n°1491841
skeye
Posté le 15-12-2006 à 14:36:25  profilanswer
 

MagicBuzz a écrit :

pour ça faudrait déjà qu'il n'ait pas un modèle des données conçu par un mongolien...


J'ai fait que survoler le post...[:joce]


---------------
Can't buy what I want because it's free -
n°1491852
MagicBuzz
Posté le 15-12-2006 à 14:44:06  profilanswer
 

dwogsi a écrit :

A mon avis ça aurait été bien plus simple avec une liaison sur une autre table pour gérer les prix par rapport aux quantités. Parce que dans ce cas là tu n'aurais qu'à récupérer le prix pour la quantité max dans celle qui sont inférieur à ta quantité choisie. Et en plus tu ne te retrouverais pas avec des champs vides!


d'où mon histoire du 8° jour ;)

n°1491876
freed102
Arayashiki
Posté le 15-12-2006 à 15:10:10  profilanswer
 

une fois de plus on tourne autour du pot... ce modele de données ce n'est pas moi qui l'ai conçut... donc ! je me plie aux règles et je cherche des solutions pour faire de sortes à ce que tout fonctionne ! j'ai qu'une seule et unique table pour toutes les informations concernant les produits... je n'ai aps le droit de changer le modele... donc je dois faire avec !

n°1491881
MagicBuzz
Posté le 15-12-2006 à 15:16:30  profilanswer
 

t'a qu'à faire une vue [:magicbuzz]  
 
 
sinon ben t'as pas 36 solutions.
 
tu récupères tes 4 champs de quantité. quand t'as trouvé une quantité strictement suppérieure, tu vas lire à reculon tes 4 champs de prix à partir de index - 1 que t'as trouvé dans ton premier test. et tu te contentes as de retourner le premier, mais quand t'en à un.
 
Par exemple...


$qty = 10;
$index = 1; while($qty > $$"bo_numint$index" && $index <= 4) { $index++; }
$prix = null; index--; while($prix == null && $index > 1) { $prix = $$"bo_numdbl$index"; $index--; }


 
:spamafote:
 
Franchement, on tourne pas autour du pot.
L'algo est évident. Si tu pars d'un modèle aussi POURRI (ça mérite la prison que de pondre des merdes pareilles) je vois pas ce que tu viens nous casser le cul à demander un truc "le meilleur possible".


Message édité par MagicBuzz le 15-12-2006 à 15:55:34
n°1491886
MagicBuzz
Posté le 15-12-2006 à 15:28:24  profilanswer
 

(chais pas ce que j'ai aujourd'hui, chuis de mauvais poil. groumpf, vivement demain)

n°1491887
freed102
Arayashiki
Posté le 15-12-2006 à 15:29:29  profilanswer
 

bah justement si je vous demande un conseil, c'est parceque c'est pas un algo habituel... celui que j'ai fait ne fonctionne pas... alors je demande si vous avez mieux à me proposer... je demande pas de critiquer les tables que je n'ai même pas conçu mais de m'aider justement à les faire fonctionner !

mood
Publicité
Posté le 15-12-2006 à 15:29:29  profilanswer
 

n°1491888
skeye
Posté le 15-12-2006 à 15:32:21  profilanswer
 

mets tous tes couples (prix, nb article) dans un tableau, et parcours-le...il n'y a pas vraiment de difficulté, là...[:dawao]


---------------
Can't buy what I want because it's free -
n°1491890
freed102
Arayashiki
Posté le 15-12-2006 à 15:34:35  profilanswer
 

j'y avais pensé aussi... ya une fonction array pour comparer tout ça ? qui va me trouver la clé la plus proche de ma valeur ?

n°1491891
skeye
Posté le 15-12-2006 à 15:36:02  profilanswer
 

tu veux pas 100 balles et un mars, aussi?[:autobot]


---------------
Can't buy what I want because it's free -
n°1491893
freed102
Arayashiki
Posté le 15-12-2006 à 15:38:45  profilanswer
 

ouai je veux bien mais là je suis à la diet !
 
... non mais je suppose qu'en combinant les fonctions array... je pourrai m'en sortir

n°1491905
MagicBuzz
Posté le 15-12-2006 à 15:53:44  profilanswer
 

t'as regardé le code que j'ai écrit hein ?
dit-moi ?
 
je fais pas de php, et pourtant j'ai résolu ton problème. à priori, ça doit même marcher tel quel si tu récupères les infos de la base façon "old school".

n°1491906
dwogsi
Défaillance cérébrale...
Posté le 15-12-2006 à 15:54:31  profilanswer
 

A ta place moi je changerais ça dans la bdd, en plus ça peut se faire rapidement en créant une nouvelle table puis un INSERT à partir d'un SELECT.

n°1491907
skeye
Posté le 15-12-2006 à 15:56:36  profilanswer
 

dwogsi a écrit :

A ta place moi je changerais ça dans la bdd, en plus ça peut se faire rapidement en créant une nouvelle table puis un INSERT à partir d'un SELECT.


s'il l'a pas créée lui-même c'est qu'il y a p-e déjà une appli qui l'utilise...:o


---------------
Can't buy what I want because it's free -
n°1491920
MagicBuzz
Posté le 15-12-2006 à 16:05:26  profilanswer
 

d'où l'intérêt de faire une vue.
 
quand je vous dit que c'est utile de faire des vues :o
 
moi y'a des fois, je me dis que je prêche dans le désert :sweat:

Message cité 1 fois
Message édité par MagicBuzz le 15-12-2006 à 16:05:52
n°1491924
skeye
Posté le 15-12-2006 à 16:06:31  profilanswer
 

Moi j'ai rien dit, pour la vue.[:joce]


---------------
Can't buy what I want because it's free -
n°1491928
dwogsi
Défaillance cérébrale...
Posté le 15-12-2006 à 16:08:22  profilanswer
 

MagicBuzz a écrit :

d'où l'intérêt de faire une vue.
 
quand je vous dit que c'est utile de faire des vues :o
 
moi y'a des fois, je me dis que je prêche dans le désert :sweat:


Oui c'est vrai la vue ici irait bien.
Mais bon...

n°1492037
freed102
Arayashiki
Posté le 15-12-2006 à 17:57:01  profilanswer
 

la vue elle est vite fait...
 
j'ai une table...
 
un champ id
20 champ varchar 255
5 champs int
10 champs double
1 champ date d'activation
1 champ date de peremption
1 champ date de creation
1 champ id de recipient
1 champ de relation de recipient
 
donc.. en quelques mots.. pour creer une fiche produit je dois me servir de tout ça !  
(et encore je l'ai fait evoluer parcequ'au debut j'avais que 2 champ int et 2 champs double ! mais le probleme c'est que ce n'est plus du tout compatible avec les anciennes versions)
 
 
PS : effectivement je suis dépendant d'un application de type CMS toute faite par la boite dans laquelle je bosse.. donc j'ai pas le droit de faire ce que je veux !


Message édité par freed102 le 15-12-2006 à 18:01:50
n°1492057
MagicBuzz
Posté le 15-12-2006 à 19:12:44  profilanswer
 

ben elle est pas compliquée à écrire la vue hein...
 


create mavue
as
select id, bo_numint2 qty, bo_numdbl1 prx from latable
union all
select id, bo_numint3 qty, bo_numdbl2 prx from latable
union all
select id, bo_numint4 qty, bo_numdbl3 prx from latable
union all
select id, bo_numint5 qty, bo_numdbl4 prx from latable;


 
ensuite pour retrouver le prix du produit d'id "25" ayant et la quantité "50" c'est pas plus compliqué que ça :
 


select m1.id, m1.prx
from mavue m1
where m1.id = 25
and m1.qty =  
(
  select max(m2.qty)
  from mavue m2
  where m2.id = m1.id
  and m2.qty >= 50
);


 
:spamafote:


Message édité par MagicBuzz le 15-12-2006 à 19:13:21
n°1496541
freed102
Arayashiki
Posté le 28-12-2006 à 11:25:20  profilanswer
 

deux semaines plus tard.. je retourne sur mon projet... ma solution est donc la suivante :
 

Code :
  1. switch ($_SESSION['panier'][$key]['qte'])
  2. {
  3. case $_SESSION['panier'][$key]['qte']>=$row_tab['bo_numint4']:$_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl4']);break;
  4. case $_SESSION['panier'][$key]['qte']>=$row_tab['bo_numint3']:$_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl3']);break;
  5. case $_SESSION['panier'][$key]['qte']>=$row_tab['bo_numint2']:$_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl2']);break;
  6. case $_SESSION['panier'][$key]['qte']<$row_tab['bo_numint2']:$_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl1']);break;
  7. default:$_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl1']);break;
  8. }


 
me reste un détail à corriger... comment faire quand un de mes $row_tab['bo_numintx'] est vide ?
 
en résumé... il fallait bien aller à reculon... chose qui ne m'etait pas évidente jusqu'à present ! maintenant ça a l'air de fonctionner


Message édité par freed102 le 28-12-2006 à 11:28:10
n°1496599
freed102
Arayashiki
Posté le 28-12-2006 à 14:01:36  profilanswer
 

voila ! ça ça marche !
 

Code :
  1. switch (true)
  2. {
  3. case ($_SESSION['panier'][$key]['qte']>=$row_tab['bo_numint4'] && $row_tab['bo_numdbl4']!="" ) :$_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl4']);break;
  4. case ($_SESSION['panier'][$key]['qte']>=$row_tab['bo_numint3'] && $row_tab['bo_numdbl3']!="" ) :$_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl3']);break;
  5. case ($_SESSION['panier'][$key]['qte']>=$row_tab['bo_numint2'] && $row_tab['bo_numdbl2']!="" ) :$_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl2']);break;
  6. case ($_SESSION['panier'][$key]['qte']<=$row_tab['bo_numint2'] && $row_tab['bo_numdbl1']!="" ) :$_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl1']);break;
  7. default:$_SESSION['panier'][$key]['prix_unitaire']=price_format($row_tab['bo_numdbl1']);break;
  8. }

n°1496600
MagicBuzz
Posté le 28-12-2006 à 14:01:39  profilanswer
 

proprement avec la vue que je t'ai filé. :spamafote:
et tes profs sont bons à piquer, tu peux leur transmètre le message.

n°1496602
freed102
Arayashiki
Posté le 28-12-2006 à 14:05:06  profilanswer
 

MagicBuzz a écrit :

proprement avec la vue que je t'ai filé. :spamafote:
et tes profs sont bons à piquer, tu peux leur transmètre le message.


 
je ne peux pas imbriquer les requetes SQL (la version de MySQL qu'on utilise ne le gere pas) de plus je cherchais un moyen simple... une condition bien écrite me parait suffisante ! mais j'arrivais pas l'ecrire (vu comment la table est renseignée).. maintenant avec mon switch ça marche... et je ne pense pas que ce soit moins propre qu'une successions de requetes SQL

n°1496610
MagicBuzz
Posté le 28-12-2006 à 14:41:58  profilanswer
 

une vue, c'est pas une succession de requêtes hein...
 
une vue c'est une abstraction du modèle afin d'obtenir une entité métier qui répond exactement à la structure dont tu as besoin pour faire des traîtements, c'est pas du tout la même chose.
 
anyway, si ta version de mysql supporte pas, c'est mort. pour des fins éducations, on doit plutôt utiliser PostGreSQL (success d'Open Ingres, SGBD sur lequel j'ai appris), qui a l'avantage de couvrir toute la norme SQL 92 (et du coup ont sait ce qu'on peut faire proprement, plutôt que d'inventer des tecniques dégueux à cause de limitations éphèmères d'un SGBD qui n'est pas terminé).
 
ça confirme d'autant plus à quel point tes profs sont nuls. c'est quoi comme école qu'on sâche qu'il ne faut pas la faire ?

Message cité 1 fois
Message édité par MagicBuzz le 28-12-2006 à 14:43:39
n°1496611
freed102
Arayashiki
Posté le 28-12-2006 à 14:43:58  profilanswer
 

MagicBuzz a écrit :

une vue, c'est pas une succession de requêtes hein...
 
une vue c'est une abstraction du modèle afin d'obtenir une entité métier qui répond exactement à la structure dont tu as besoin pour faire des traîtements, c'est pas du tout la même chose.
 
anyway, si ta version de mysql supporte pas, c'est mort.
 
ça confirme d'autant plus à quel point tes profs sont nuls. c'est quoi comme école qu'on sâche qu'il ne faut pas la faire ?


 
 
.. euh.. là il y a un mal entendu... je sais que dès fois je me comporte comme un débutant... mais je ne suis pas dans une école !  :sarcastic:  :kaola:  :hello:

n°1496622
MagicBuzz
Posté le 28-12-2006 à 15:00:08  profilanswer
 

ah, tu parlais de projet, spoursa.
mais à la base, c'est vrai que quand on bosse on peut faire aussi des projets :D je fais de la TMA depuis trop longtemps moi :sleep:


Message édité par MagicBuzz le 28-12-2006 à 15:01:13
n°1496627
freed102
Arayashiki
Posté le 28-12-2006 à 15:04:55  profilanswer
 

oui je suis bel et bien en poste actuellement... mais je suis un autodidacte à la base... donc j'ai pas toutes les connaissances théoriques qui ne m'handicapent pas vraiment mais qui peut etre pourraient m'aider parfois... jusqu'à présent j'arrive à me débrouiller.. j'ai tout de mêmes quelques bases (Modèlisation et normalisation de données (Merise) UML etc etc...) je sais me debrouiller.. mais je ne les utilise que pour des trucs complexes (une boutique en ligne par exemple.. là on a pas le droit à l'erreur !) ... mais là le probleme est plus grand que ça... vu que le modèle de données est deja écrit.. et qu'il doit etre adapté sans etre modifié en fonction de chaque besoin

n°1496811
Tamahome
⭐⭐⭐⭐⭐
Posté le 28-12-2006 à 20:34:17  profilanswer
 

MagicBuzz a écrit :

pour ça faudrait déjà qu'il n'ait pas un modèle des données conçu par un mongolien...


 
[:hahaguy]

n°1497290
leflos5
On est ou on est pas :)
Posté le 30-12-2006 à 12:02:08  profilanswer
 

Par curiosité, aurions nous le loisir de comprendre pourquoi le mcd qui a manifestement été puni de toute logique, n'est pas modifiable :??:
 
Parce que je fais que répéter une fois de plus là, mais c'est horrible comme modèle et tes galères n'en sont qu'à leur début :d

n°1497323
dwogsi
Défaillance cérébrale...
Posté le 30-12-2006 à 15:01:35  profilanswer
 

ça n'est pas modifiable, ou pas facilement, dans le cas où on a déjà toute une application/un site qui tourne avec un modèle.

n°1497410
Tamahome
⭐⭐⭐⭐⭐
Posté le 30-12-2006 à 21:11:21  profilanswer
 

enfin qui "tourne"... c'est un bien grand mot. J'aurais plutot dit "qui n'est pas encore tomber en panne, par on ne sait quel mystere"

n°1497455
dwogsi
Défaillance cérébrale...
Posté le 31-12-2006 à 02:02:55  profilanswer
 

C'est vrai qu'un modèle mal conçut ça laisse supposer tout un tas d'autres problèmes.

n°1497475
Tamahome
⭐⭐⭐⭐⭐
Posté le 31-12-2006 à 10:09:15  profilanswer
 

des fois ca coute moins cher de tout remettre a plat que de continuer a vivoter avec un vieux machin qui marche par on ne sait quel miracle...

n°1497961
MagicBuzz
Posté le 02-01-2007 à 14:56:19  profilanswer
 

Tamahome a écrit :

enfin qui "tourne"... c'est un bien grand mot. J'aurais plutot dit "qui n'est pas encore tomber en panne, par on ne sait quel mystere"


par chez nous, on dit "elle est tombée en marche" dans ces cas là :D

n°1498045
Tamahome
⭐⭐⭐⭐⭐
Posté le 02-01-2007 à 19:56:56  profilanswer
 

oui, on dit ca aussi par chez nous :p

n°1498150
freed102
Arayashiki
Posté le 03-01-2007 à 11:11:04  profilanswer
 

leflos5 a écrit :

Par curiosité, aurions nous le loisir de comprendre pourquoi le mcd qui a manifestement été puni de toute logique, n'est pas modifiable :??:
 
Parce que je fais que répéter une fois de plus là, mais c'est horrible comme modèle et tes galères n'en sont qu'à leur début :d


 
et bien tout simplement parcequ'il s'agit d'un "outil" qui n'etait pas destiné au depart à faire ce genre d'application...  et aussi parcequ'il s'agit d'un "socle" qui est utilisé depuis des années sur des centaines de sites.. et qu'il faut garder un minimum de compatibilité avec les autres outils... le MCD du CMS complet est deja très complexe ! car là il ne s'agit que d'un petit outil qui sera géré par le site tout entier !

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  un bon algorithme pour trouver le bon prix

 

Sujets relatifs
Trouver path d'un exeCalcul de prix avec Access + VB
Inversion de matrice & Algorithme de Gauss-JordanProgramme pour algorithme
erreur SQL # 1064: Je n'arrive pas à trouver la solutionLdap + Php pour trouver le SID d'un user
[csh] trouver et remplacer[systeme de paiement PHP] Es ce possible et à quel prix?
Algorithme de simplification d'équation booléenne[PHP... ou autres] trouver les termes liés dans un texte
Plus de sujets relatifs à : un bon algorithme pour trouver le bon prix


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)