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 :

[POO] portée d'un array_mutisort sur les attributs d'un objet


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut [POO] portée d'un array_mutisort sur les attributs d'un objet
    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)

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Je crois avoir résolu le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        $price = &$this->Price[$Product];
        $quantity = &$this->Quantity[$Product];
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        $price = $this->Price[$Product];
        $quantity = $this->Quantity[$Product];
    Permet de travailler avec les bons index.

    J'espère juste que cette résolution ne va pas me créer des bugs autre part

    A ce propos, j'ai cru comprendre qu'en php5, tous les objets étaient systématiquement passés par référence. Est ce à dire que mon code initial aurait tout à fait fonctionné sous php5 ?

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

Discussions similaires

  1. POO : besoin de confirmation sur les attributs statics
    Par loic20h28 dans le forum Design Patterns
    Réponses: 2
    Dernier message: 21/01/2009, 08h40
  2. Réponses: 2
    Dernier message: 17/04/2007, 17h14
  3. [SQL] Besoin d'aide sur les attributs pour une requete
    Par bobobobo01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/11/2006, 21h39
  4. Réponses: 7
    Dernier message: 13/02/2006, 17h13
  5. question sur les attributs javascript
    Par PAYASS59 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/04/2005, 13h34

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