Bonjour,
le problème est le suivant :
une classe Market qui modelise un marché d'échange avec des tickets vendeur pour différents produits
une classe Agent qui modélise le comportement de chaque agent sur le marché
Une méthode Buy de la classe agent pose problème. Au niveau de ce code :
Avant passage de la fonction Evalprice sur l'objet Market (qui est passé par référence dans cette fonction), tous les tickets du marché sont ordonnés correctement, après passage de cette fonction, les tickets sont triés dans un ordre différent à cause de l'utilisation de array_multisort dans cette fonction. Or, je souhaite utiliser array_multisort de façon interne dans la fonction EvalPrice et ne souhaite absolument pas que le tri ait une incidence sur les attributs de la classe Market
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 $EvalMarket = $Market; if ($Test) {$Market->DrawOffer('Seigle')."<br>";} for ($i=0; $i<$nb_input; $i++) { $amount_input[$i] = $EvalMarket->EvalPrice($TabInputName[$i], $q_input[$i]); //$amount_input[$i] = $Market->EvalPrice($TabInputName[$i], $q_input[$i]); //$q_market[$i] = $Market->Quantity[$TabInputName[$i]][$index]; $amount = $amount + $amount_input[$i]; } if ($Test) {$Market->DrawOffer('Seigle')."<br>";}
La fonction EvalPrice se présente comme suit :
Elle retourne le montant total des tickets les moins chers pour obtenir la quantité désirée et ne doit logiquement faire que cela.
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 function EvalPrice($Product, $Quantity) { $evalprice = 0; $q_buy = 0; $q_tobuy = $Quantity; $price = $this->Price[$Product]; $quantity = $this->Quantity[$Product]; array_multisort($price, $quantity); foreach ($price as $key=>$element) { //while ($q_buy < $Quantity) { $q_batch = $quantity[$key]; if ($q_tobuy < $q_batch) { $p_batch = $element; $batch_amount = $q_tobuy * $p_batch; $evalprice = $evalprice + $batch_amount; $q_buy = $q_buy + $q_tobuy; $q_tobuy = $Quantity - $q_buy; } else { $p_batch = $element; $batch_amount = $q_batch * $p_batch; //echo $batch_amount." _ "; $evalprice = $evalprice + $batch_amount; $q_buy = $q_buy + $q_batch; $q_tobuy = $Quantity - $q_buy; } //} } return $evalprice; }
Or cette fonction (au niveau du array_multisort) me trie les attributs de mon objet Market ce que je ne souhaite pas en dehors d'elle.
En principe, avec
Je ne travaille pas directement sur les attributs de la classe, mais sur une copie de ceux-ci, il ne devrait donc pas y avoir d'incidence en dehors de la fonction et pourtant ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $price = $this->Price[$Product]; $quantity = $this->Quantity[$Product]; array_multisort($price, $quantity);
Avant passage de la fonction, mes tickets pour un produits donné sont les suivants :
produit/quantité/prix/vendeur (avec num vendeur, num ticket)
Seigle 19 4 1 _ 0
Seigle 29 4 1 _ 2
or la fonction transforme le marché de la façon suivante :
produit/quantité/prix/vendeur
Seigle 19 4 1 _ 0
Seigle 4 1 _ 2
avec le code
oui ainsi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $EvalMarket = $Market; $amount_input[$i] = $EvalMarket->EvalPrice($TabInputName[$i], $q_input[$i]);
produit/quantité/prix/vendeur
Seigle 19 4 1 _ 0
Seigle 29 4 _ 1
avec le code
Le problème semble être lié à un mauvaise gestion des copies par valeur ou par référence mais j'ai du mal à voir d'ou cela provient.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $amount_input[$i] = $Market->EvalPrice($TabInputName[$i], $q_input[$i]);
Enfin en tout état de cause, il faudrait que je travaille dans la fonction EvalPrice sur une copie complète pour que le tri array_multisort n'aie aucune incidence sur les attributs de la classe Market mais je n'arrive pas à voir comment taper mon code (et j'ai absolument besoin que Market soit passé par référence dans la fonction Buy de la classe Agent (c'est dans cette fonction qu'est appelée la méthode EvalPrice)
Partager