sparh Posté 19 Octobre 2016 Posté 19 Octobre 2016 Bonjour, j'ai un plugin de géolocalisation qui envoi des données au serveur les données sont envoyés sous cette forme: $values = '{ "location": { "coords": { "latitude": [Float], "longitude": [Float] "accuracy": [Float] "speed": [Float|-1], "heading": [Float/0-360|-1], "altitude": [Float] }, "extras": { // <-- optional extras. @see #getCurrentPosition for details "foo": "bar" }, "activity": { "type": [still|on_foot|walking|running|in_vehicle|on_bicycle|unknown], "confidence": [Int/0-100%] }, "geofence": { // <-- Present only if a geofence was triggered at this location "identifier": [String], "action": [String ENTER|EXIT] }, "battery": { "level": [Float/0-1], "is_charging": [Boolean] }, "timestamp": [ISO-8601 UTC], // eg: "2015-05-05T04:31:54.123Z" "uuid": [String], // <-- Universally unique identifier "event" [String], // <-- motionchange|geofence|heartbeat "is_moving": [Boolean], // <-- The motion-state when location was recorded (@deprecated; use #event) "is_heartbeat: [Boolean], // <-- If this location was recorded during heartbeat mode. "odometer": [Float/meters] } }'; Pour le traitement j'utilise : $retour = json_decode($values,true); $speed = $retour['location']['coords']['speed']; $longitude = $retour['location']['coords']['longitude']; etc... Mais dans certains cas "location" est un tableau, ce qui donne $values = '{ "location": [{ "coords": { "latitude": [Float], "longitude": [Float] "accuracy": [Float] "speed": [Float|-1], "heading": [Float/0-360|-1], "altitude": [Float] }, "extras": { // <-- optional extras. @see #getCurrentPosition for details "foo": "bar" }, "activity": { "type": [still|on_foot|walking|running|in_vehicle|on_bicycle|unknown], "confidence": [Int/0-100%] }, "geofence": { // <-- Present only if a geofence was triggered at this location "identifier": [String], "action": [String ENTER|EXIT] }, "battery": { "level": [Float/0-1], "is_charging": [Boolean] }, "timestamp": [ISO-8601 UTC], // eg: "2015-05-05T04:31:54.123Z" "uuid": [String], // <-- Universally unique identifier "event" [String], // <-- motionchange|geofence|heartbeat "is_moving": [Boolean], // <-- The motion-state when location was recorded (@deprecated; use #event) "is_heartbeat: [Boolean], // <-- If this location was recorded during heartbeat mode. "odometer": [Float/meters] }, { "coords": { "latitude": [Float], "longitude": [Float] "accuracy": [Float] "speed": [Float|-1], "heading": [Float/0-360|-1], "altitude": [Float] }, "extras": { // <-- optional extras. @see #getCurrentPosition for details "foo": "bar" }, "activity": { "type": [still|on_foot|walking|running|in_vehicle|on_bicycle|unknown], "confidence": [Int/0-100%] }, "geofence": { // <-- Present only if a geofence was triggered at this location "identifier": [String], "action": [String ENTER|EXIT] }, "battery": { "level": [Float/0-1], "is_charging": [Boolean] }, "timestamp": [ISO-8601 UTC], // eg: "2015-05-05T04:31:54.123Z" "uuid": [String], // <-- Universally unique identifier "event" [String], // <-- motionchange|geofence|heartbeat "is_moving": [Boolean], // <-- The motion-state when location was recorded (@deprecated; use #event) "is_heartbeat: [Boolean], // <-- If this location was recorded during heartbeat mode. "odometer": [Float/meters] } etc...] }'; Auriez vous une idée de comment récupérer les données ? Merci d'avance
Aenoa Posté 19 Octobre 2016 Posté 19 Octobre 2016 Bonjour, Quelles données exactement souhaitez vous récupérer? Toutes ? J'ai remarqué que vous le convertissez en array, pourquoi ne pas utiliser une méthode telle que count pour savoir si location contient un seul ou plusieurs objets ? Ou éventuellement, vérifier avec une méthode d'array si une des clés sensée ne pas s'y trouver existe dans le nœud de location.
sparh Posté 19 Octobre 2016 Auteur Posté 19 Octobre 2016 Bonjour, oui j'aimerai pouvoir récupérer toutes les données. Je convertit en array car après avoir bien galéré c'est le seul moyen que j'ai trouvé pour y arriver Quand je fais un count($retour) dans tous les cas j'obtient 1. Dans le cas ou location est un tableau rien ne fonctionne la fonction json_decode me renvoi null.
BlackPage Posté 19 Octobre 2016 Posté 19 Octobre 2016 (modifié) Salut, A priori, vu la structure de la réponse on devrait avoir : $retour = json_decode($values,true); var_dump($retour) => sdtclass object Et à partir de là : if (!is_array($retour->location)){ // si la propriété location de retour n'est pas un tableau $speed = $retour->location->coords->speed; var_dump($speed) => float; } else { for ($i=0 ; $i<count($retour->location) ; $i++){ $speed = $retour->location[$i]->coords->speed; var_dump($speed) => float; } } Je trouve curieux que tu récupères un array et pas un objet... Peut être ton json_decode qui fait mal le boulot ( paramètre true ) ? Edit : effectivement d'apres la doc php c'est le true qui renvoie un tableau associatif... Fais donc plutot : $retour = json_decode($values); var_dump($retour) => stdclass object Et tu pourras utiliser mon code tel quel. Modifié 19 Octobre 2016 par BlackPage
sparh Posté 19 Octobre 2016 Auteur Posté 19 Octobre 2016 Merci de m'aider mais dans les 2 cas j'obtient null (j'avais déja testé pour voir si $values['location'] retournait un tableau). $retour = json_decode($values,true); var_dump($retour); $retour = json_decode($values); var_dump($retour); Voici un exemple de ma variable $values si jamais et la manière dont je la récupère $values = file_get_contents('php://input'); //si je fait un echo $values j'obtient ça {"location":[{"coords":{"speed":13.78999996185303,"longitude":6.106461001741759,"latitude":46.20269310378117,"accuracy":10,"heading":239.3082580566406,"altitude":424.451416015625,"altitudeAccuracy":6},"is_heartbeat":false,"extras":{"action":""},"is_moving":true,"odometer":1763.193420100596,"uuid":"4C420566-1F55-4A89-83DA-F03D5C9E2423","activity":{"type":"unknown","confidence":100},"battery":{"level":0.28,"is_charging":false},"timestamp":"2016-10-19T09:13:12.000Z"},{"coords":{"speed":12.67000007629395,"longitude":6.105477869875073,"latitude":46.20219555439851,"accuracy":10,"heading":217.1203918457031,"altitude":424.525390625,"altitudeAccuracy":6},"is_heartbeat":false,"extras":{"action":""},"is_moving":true,"odometer":1857.093282904583,"uuid":"603BD74E-7324-4C17-B21A-E16C7430BC3D","activity":{"type":"unknown","confidence":100},"battery":{"level":0.28,"is_charging":false},"timestamp":"2016-10-19T09:13:19.000Z"}]}
sparh Posté 20 Octobre 2016 Auteur Posté 20 Octobre 2016 Hello je devais être très fatigué hier car ce matin ça fonctionne! Merci pour votre aide
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant