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 :
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>";}
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

La fonction EvalPrice se présente comme suit :
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;    
  }
Elle retourne le montant total des tickets les moins chers pour obtenir la quantité désirée et ne doit logiquement faire que cela.

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
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);
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 ...

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
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]);
oui ainsi
produit/quantité/prix/vendeur
Seigle 19 4 1 _ 0
Seigle 29 4 _ 1

avec le code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
$amount_input[$i] = $Market->EvalPrice($TabInputName[$i], $q_input[$i]);
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.

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)