Aller au contenu
sparh

Extraction des données d'une chaîne

Noter ce sujet :

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

Partager ce message


Lien à poster
Partager sur d’autres 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. 

 

 

Partager ce message


Lien à poster
Partager sur d’autres 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.

Partager ce message


Lien à poster
Partager sur d’autres 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.

Modifié par BlackPage

Partager ce message


Lien à poster
Partager sur d’autres 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"}]}

 
 

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×