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 :

Souci avec un tableau d'objets


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 19
    Points
    19
    Par défaut Souci avec un tableau d'objets
    Bonjour,
    J'ai un petit souci avec mon code écrit en PHP.
    voici ma classe-entité Datatrack représentant la table datatrack dans laquelle sont recueillies les informations de position.
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    <?php
    class Datatrack {
        const SQL_IDENTIFIER_QUOTE='"';
        const FIELD_DT_DATEPOS=1;
        const FIELD_DT_DATEINSERT=2;
        const FIELD_DT_LAT=5;
        const FIELD_DT_LNG=6;
        const FIELD_DT_SPEED=10;
     
        private static $FIELD_NAMES = array(
            self::FIELD_DT_DATEPOS => 'dt_datepos',
            self::FIELD_DT_LAT => 'dt_lat',
            self::FIELD_DT_LNG => 'dt_lng',
            self::FIELD_DT_SPEED => 'dt_speed');
     
        private $dtDatepos;
        private $dtLat;
        private $dtLng;
        private $dtSpeed;
        //L'état du moteur Arrêt|Pause|Mouvement
        private $engineStatus;
        private $engineStatusCode;
     
     
        public function setDtDatepos($dtDatepos) {
            $this->dtDatepos = $dtDatepos;
        }
     
        public function getDtDatepos() {
            return $this->dtDatepos;
        }
     
        public function setDtLat($dtLat) {
            $this->dtLat = $dtLat;
     
        }
     
        public function getDtLat() {
            return $this->dtLat;
        }
     
        public function setDtLng($dtLng) {
            $this->dtLng = $dtLng;
     
        }
        public function getDtLng() {
            return $this->dtLng;
        }
     
        public function setDtSpeed($dtSpeed) {
            $this->dtSpeed = $dtSpeed;
     
        }
     
        public function getDtSpeed() {
            return $this->dtSpeed;
        }
     
         public function setEngineStatus($engineStatus) {
            $this->engineStatus = $engineStatus;
     
        }
     
        public function getEngineStatus() {
            return $this->engineStatus;
        }
     
         public function setEngineStatusCode($engineStatusCode) {
            $this->engineStatusCode = $engineStatusCode;
     
        }
     
        public function getEngineStatusCode() {
            return $this->engineStatusCode;
        }
     
     
        public static function getFieldNames() {
            return self::$FIELD_NAMES;
        }
     
     
        public function toArray() {
            return array(
                self::FIELD_DT_DATEPOS => $this->getDtDatepos(),
                self::FIELD_DT_LAT => $this->getDtLat(),
                self::FIELD_DT_LNG => $this->getDtLng(),
                self::FIELD_DT_SPEED => $this->getDtSpeed());
     
        }
     
        public static function findBySql(PDO $db, $sql) {
            $stmt = $db->query($sql);
            $resultInstances = array();
            while ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
                $o = new Datatrack();
                $o->assignByHash($result);
                $resultInstances[] = $o;
            }
            $stmt->closeCursor();
            return $resultInstances;
        }
     
        public function assignByHash($result) {
            $this->setDtDatepos($result['dt_datepos']);
            $this->setDtLat($result['dt_lat']);
            $this->setDtLng($result['dt_lng']);
            $this->setDtSpeed($result['dt_speed']);
        }
     
        public function __toString() {
            return $this->getEngineStatus()."<br/>";
        }
    }
    ?>
    la méthode findBySql retourne un tableau d'objets qui est traité par la fonction processtrack():
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    <?php
    function processtrack($track) {
        $num_rows = count($track);
        $stopstatusfound = false;
        $stopped = true;
        $moving = false;
        $test = false;
        $endFirstStopStatus = false;
        $DTA = 0;
        $FTA = 0;
        $DTT = 0;
        $FTT = 0;
        $ptracks = array();
        $tr = null;
     
            for ($i = 0; $i < $num_rows; $i++) {
                //$status = $track[$i]->getDtAlarm();
                $speed = $track[$i]->getDtSpeed();
                $isOff = ($speed < 2);
                if ($isOff) {
                    if (!$stopstatusfound) {
                        $stopped = true;
                        $moving = false;
                        $test = false;
                        $DTA = $i;
                        $stopstatusfound = true;
                        $endFirstStopStatus = true;
                        continue;
                    }
                }
                if (!$test) {//test=false
                    if ($stopped) {
                        if ($isOff) {//arret=on
                            $FTA = $i;
                        } else {//mvt=on
                            $DTT = $i;
                            $FTT = $i;
                            $stopped = false;
                            $test = false;
                            $moving = true;
                            if (!$endFirstStopStatus) {
                                $tr = $track[$DTT];
                                $tr->setEngineStatus("Fin Arrêt");
                                $tr->setEngineStatusCode("FA");
                                $ptracks[] = $tr;
                            } else {
                                $endFirstStopStatus = false;
                            }
                            $tr = $track[$DTT];
                            $tr->setEngineStatus("Debut Trajet");
                            $tr->setEngineStatusCode("DT");
                            $ptracks[] = $tr;
                        }
                    }
                    if ($moving) {
                        if ($isOff) {//arret                        
                            $DTA = $i;
                            $FTA = $i;
                            $test = true;
                        } else {
                            $FTT = $i;
                            $tr = $track[$FTT];
                            if ($speed >= 2) {
                                $tr->setEngineStatus("Mouvement");
                                $tr->setEngineStatusCode("AA");
                            } else {
                                $tr->setEngineStatus("Pause");
                                $tr->setEngineStatusCode("ST");
                            }
                            $ptracks[] = $tr;
                        }
                    }
                } else {//test=true
                    if (($isOff) & ($stopped)) {
                        $FTA = $i;
                        $test = false;
                    } else if ((!$isOff) & ($stopped)) {
                        $FTT = $i;
                    } else if (($isOff) & ($moving)) {
                        $FTA = $i;
                        $timediff = Tools_DateTime::diff($track[$DTA]->getDtDatepos(), $track[$FTA]->getDtDatepos()) / 60;
                        if ($timediff > 1) {
                            $stopped = true;
                            $test = false;
                            $moving = false;
                            $tr = $track[$FTT];
                            $tr->setEngineStatus("Fin Trajet");
                            $tr->setEngineStatusCode("FT");
                            $ptracks[] = $tr;
     
                            $tr = $track[$DTA];
                            $tr->setEngineStatus("Debut Arrêt");
                            $tr->setEngineStatusCode("DA");
                            $ptracks[] = $tr;
                        }
                    } else if (!($isOff) & ($moving)) {
                        $test = false;
                        $FTT = $i;
                    }
                }//Fin else test
            }//Fin boucle
     
        return $ptracks;
    }
    ?>
    Voici ma page de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
    $sql = "SELECT * FROM datatrack ORDER BY dt_datepos";
    $tracks = Datatrack::findBySql($db, $sql);
    $ptracks = processtracks($tracks);
    echo "<pre>";
    print_r($ptracks);
    echo "</pre>";
    ?>
    A l'affichage du contenu du tableau retourné, je remarque que les objets subissent des modifications. Ce qui rend l'algo faux. Mais si je me passe du tableau en affichant directement les objets au fur et à mesure qu'ils sont traités, j'obtiens le résultat escompté.
    Svp, aidez moi!
    merci

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Il s'agissait juste d'un problème de référence sur les objets. Je devrais cloner les objets avant de les modifier.

Discussions similaires

  1. Soucis avec les tableau
    Par dunbar dans le forum Langage
    Réponses: 3
    Dernier message: 10/03/2009, 16h55
  2. Soucis avec un tableau
    Par nebule dans le forum Struts 1
    Réponses: 1
    Dernier message: 05/02/2007, 17h40
  3. Problème avec un tableau d'objet
    Par tyrant dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 18/11/2006, 20h45
  4. pb d'invoke de methode avec un tableau d'objets en parametre
    Par sebastien2222 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 27/09/2006, 11h33
  5. un problème avec un tableau d'objet, erreur bete ?
    Par Heero_2040 dans le forum C++
    Réponses: 12
    Dernier message: 13/07/2006, 14h20

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