Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/07/2011, 10h14   #1
Invité de passage
 
Inscription : mai 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 23
Points : 4
Points : 4
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 :
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 :
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 :
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
mario002e est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 11h54   #2
Invité de passage
 
Inscription : mai 2008
Messages : 23
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 23
Points : 4
Points : 4
Il s'agissait juste d'un problème de référence sur les objets. Je devrais cloner les objets avant de les modifier.
mario002e est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h11.


 
 
 
 
Partenaires

Hébergement Web