Jump to content
sparh

Extraction des données d'une chaîne

Rate this topic

Recommended Posts

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

Share this post


Link to post
Share on other sites

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. 

 

 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Edited by BlackPage

Share this post


Link to post
Share on other sites

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"}]}

 
 

Share this post


Link to post
Share on other sites

Hello
je devais être très fatigué hier car ce matin ça fonctionne!
Merci pour votre aide

Share this post


Link to post
Share on other sites

Ravi de l'apprendre !

 

Bon début de journée :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...