Ik heb hier een stukje AJAX-code die wat coordianten uit een API ophaalt, en verwerkt in Google Maps met een timertje die elke 5 seconden ververst. En zodoende heb je dus een mooie voertuigtracker... als het werkt.

Echter is het probleem dat deze in een recursieve loop draait, geeft de debugger weer, en inderdaad wordt er een hoop geheugen gebruikt.

Dus, het werkt niet. En het ligt aan de format van de JSON-string, heb ik het idee.
Als deze gewoon leeg is dan laad hij het script prima in (en uiteraard op de 0,0 locatie). Maar met onderstaande JSON-string in de request gaat hij dus voluit op zijn plaat op lijn nummer 15.

Wat gaat er mis?


{"1234":{"DateGPS":"2017-10-22T22:55:45+02:00","DateReceived":"2017-10-22T22:55:46.071+02:00","Longitude":5.74551,"Latitude":52.01425,"Speed":139,"DOP":0,"VehicleNumber":"1234","VehicleType":"Sprinter","TrainNumber":"4321"}}


Het stukje (ingekortte) code



function getCoords() {
	    $.ajax({
		url: "api.php",
		type: "GET",
		cache: false, 
		data: {
		    action : "trainset",
		    number : '1234'
		},
		dataType: "text",
		success: function(returnedData) {
		    alert(returnedData);
		    var jsondata = jQuery.parseJSON(returnedData);
		      console.log('Joehoe'+returnedData);
		      var coords = jsondata.Latitude+','+jsondata.Longitude;
		      alert(coords);
		      //console.log('Lat: '+jsondata.Latitude);
		      var coordsArray = coords.split(",");
		      moveMarkerMap(coordsArray[0], coordsArray[1]);
		      setTimeout(getCoords, 5000);
		      
		      
		},
		done: function(data) {
		    //setTimeout(getCoords, 5000); // hier werkt hij niet.
		} 	
	     }); 
	}

function moveMarkerMap(lat,lon) {
	    var newLatLang = new google.maps.LatLng(lat,lon);
	    map.panTo(newLatLang);
	    marker.setPosition(newLatLang);
	}      
Ja, ik kan ook data krijgen van meerdere trainsets, als je op het TrainNumber (Lijnnummer/Treinnummer) filtert. (m.a.w. treinen kunnen ook gekoppeld rijden).

En die 1234 is in dit geval een (fictief) VehicleNumber van een trein, en geen dummy iets.
Maar opsich lijkt mij dat die eerste array overbodig is, zodat je per trainset een enkele array hebt.
Dus dat lijkt mij logischer.
Misschien kan je iets met de JavaScript functie clearTimeout.
Daar ga ik naar kijken, maar het probleem zit hem echt in de JSON string, en die (onnodige sub-array)

Ik duik even de code in om die array te genereren:

<?php
$arr = json_decode($content,true);
	    //$newfeed = array();
	foreach($arr as $data) {
	    $newfeed[$data['Trackee']]['DateGPS'] = $data['DateGps'];
	    $newfeed[$data['Trackee']]['DateReceived'] = $data['DateReceived'];
	    $newfeed[$data['Trackee']]['Longitude'] = $data['Longitude'];
	    $newfeed[$data['Trackee']]['Latitude'] = $data['Latitude'];
	    $newfeed[$data['Trackee']]['Speed'] = $data['Speed'];
	    $newfeed[$data['Trackee']]['DOP'] = $data['Dop'];
	    $newfeed[$data['Trackee']]['VehicleNumber'] = strip_additionals($data['Trackee']);
	    $newfeed[$data['Trackee']]['VehicleType'] = getVehicleTypesByVehicleNumber(strip_additionals($data['Trackee']));
	    $newfeed[$data['Trackee']]['TrainNumber'] = $data['Number'];
	    $newfeed[$data['Trackee']]['Status'] = getTrainStatus($data['Number']);
	}
	$feed = json_encode($newfeed);
	return $feed;
?>

Hoe maken we er dan per trainset een enkele array van?
$arr is het orgineel, en ik wil de API dus wijzigen met extra inhoud, en andere aanduidingen. En die commented array helpt ook niet.

Hmmm....

Hoe maken we er dan per trainset een enkele array van?

Opvragen via specifiek $data['Trackee'] en dan alleen een array/object teruggeven met DateGPS, DateReceived, ... en alle andere informatie die je er in wilt stoppen?
Dat doe ik toch ook?
Want ik wil namelijk een heel nieuwe array opbouwen, dan die van $data.
En dus geen array in een array.

Dus eigenlijk moet er dan dit bijv. kunnen uitkomen (in dit geval zijn dat er twee trainsets, wat natuurlijk ook een enkele kan zijn):

[{"DateGps":"2017-10-23T09:20:00+02:00","DateReceived":"2017-10-23T09:20:00.864+02:00","Longitude":5.17141,"Latitude":52.16514,"Speed":115,"DOP":0,"VehicleNumber":"2459","TrainNumber":"5726"},{"DateGps":"2017-10-23T09:19:58+02:00","DateReceived":"2017-10-23T09:19:59.218+02:00","Longitude":4.67238,"Latitude":52.3829,"Speed":18,"DOP":0,"VehicleNumber":"2978","TrainNumber":"5420"}]

En dit stelt dus een enkele array voor per trainset, en geen multi-dimensionale en ook geen key.
Maar hoe krijg ik dat dan voor elkaar? Ik krijg dan constant die key er steeds bij :/

Update 1:
Ik kreeg vanmorgen in mijn schoot geworpen van een vriend dat ik in een enkel element in de foreach een array moet aanmaken met die trein-properties en values. Erg logisch, en 'that was the trick'!

Update 2:
Echter bij het filteren op een waarde van een propterty/argument gaat het ook mis:
https://3v4l.org/CnbbQ

<?php
$array = json_decode($json,true);
$resulted_array = array_filter($array,function($v){ return ($v['Trackee'] == '2469');});

echo json_encode($resulted_array);
?>



    {"11":{"DateGps":"2016-08-04T00:36:54+02:00","DateReceived":"2016-08-04T00:36:55.813+02:00","Longitude":4.3087,"Latitude":52.0525,"Track":354,"Speed":50,"Dop":1,"Trackee":"2469","Bps":"MC 112-63,3","Number":"15184"}}


[size=xsmall]Toevoeging op 23/10/2017 23:33:20:[/size]

Update 3:

Het probleem is getackeld, en de key is eruit gehaald zodat de AJAX-request in getCoords() de boel beter kan uitlezen.


$json_to_array = json_decode($json, true);
$resulted_array = array_values(array_filter($json_to_array,function($v){ return ($v['VehicleNumber'] == $_GET['VehicleNumber']);}));
if (count($resulted_array) == 1) // Als hij niet 1 is is het item niet gevonden...
	$resulted_array = $resulted_array[0];
	echo json_encode($resulted_array);
?>


Thnx to all voor de adviezen :-)

Reageren