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.
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
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/>"; } } ?>
Voici ma page de test:
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; } ?>
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é.
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>"; ?>
Svp, aidez moi!
merci
Partager