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