Question

Je me bats pour analyser les données ci-dessous à l'aide de PHP. Une API retourne, et je l'ai essayé plusieurs syntaxes. Comment puis-je retourner les données d'une manière non-objet? Ou, quelle est la syntaxe pour appeler les données en utilisant le stdClass?

Puis-je convertir en une matrice à base de données, ou même deux? Je suis perdu en ce qui concerne les ensembles de données basés sur l'objet.

stdClass Object
(
    [0] => stdClass Object
        (
            [district] => stdClass Object
                (
                    [state] => NY
                    [number] => 29
                )

        )

    [1] => stdClass Object
        (
            [district] => stdClass Object
                (
                    [state] => NY
                    [number] => 26
                )

        )

)

Quand je crée l'objet sur mon propre, puis faire un var_dump, je reçois ceci:

object(stdClass)#8 (2) {
  [0]=>
  object(stdClass)#4 (1) {
    ["district"]=>
    object(stdClass)#5 (2) {
      ["state"]=>
      string(2) "NY"
      ["number"]=>
      string(2) "29"
    }
  }
  [1]=>
  object(stdClass)#6 (1) {
    ["district"]=>
    object(stdClass)#7 (2) {
      ["state"]=>
      string(2) "NY"
      ["number"]=>
      string(2) "26"
    }
  }
}
Était-ce utile?

La solution

Ils jettent probablement des tableaux à des objets dans leur code ($object = (object) $array). Ceci a l'avantage qu'il sera passé par référence à partir de maintenant (comme est la valeur par défaut avec des objets) et l'inconvénient que l'objet est complètement inutile (les membres ne peuvent pas commencer par les numéros - voir le regex dans les docs de PHP ) jusqu'à ce que vous le lancez retour (PHP ne permet certaines choses très mystérieuses):

$array = (array) $bogusObject;
$array[0]->district->state === 'NY';

Autres conseils

Utilisation:

$object->{'0'}->district->state

En gros, vous êtes à court coupe l'attribution d'une chaîne à une variable, puis en utilisant cette variable comme accesseur objet.

$zero = "0";
$object->$zero; /* or */ $object->{$zero};

Je regarde maintenant leur code, et malheureusement, ils n'ont pas exposé l'option dans leur classe pour vous de demander les données comme un arbre de tableau associatif vs un arbre objet stdClass.

Le "problème" est à la ligne 96 class.sunlightlabs.php

return json_decode( $data );

Vous avez un couple d'options.

  1. Il suffit d'utiliser la syntaxe stdClass.
  2. Convertir l'arbre stdClass retourné dans un tableau associatif un

# 1 en action

// echo the state of the 2nd object in the result
echo $result->{0}->district->state;

# 2 en action

$result = toArray( $result );

function toArray( $data )
{
  if ( is_object( $data ) )
  {
    $data = get_object_vars( $data );
  }
  return is_array($data) ? array_map(__FUNCTION__, $data) : $data;
}

Vous pouvez aussi travailler avec leur classe directement via une application créative des modèles, mais ils font un usage intensif de sublcasses déjà ce qui complique un peu, donc je en tenir à une de ces deux solutions.

Vous pouvez itérer à travers l'objet comme ceci:

foreach ($obj as $each) {
    echo $each->district->state . ' - ' . $each->district->number . '<br />';
}

L'utilisateur « null » a suggéré ce sujet dans les commentaires, mais que vous voulez le mettre ici il est donc pas manqué si easly.

La meilleure option est de passer TRUE en tant que deuxième dans json_decode param dire json_decode ($ data, TRUE) ce qui rend le retour des tableaux associatifs au lieu de classes. Donc, si vous avez accès au code source -. Faire ce changement

Cette solution de soulmerge fonctionnait très bien pour moi:

$array = (array) $bogusObject;
$array[0]->district->state === 'NY';

Merci beaucoup !!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top