2009-10-14 20 views
5

Tengo dificultades para analizar los datos a continuación usando PHP. Una API lo devuelve, y he probado varias sintaxis. ¿Cómo devuelvo los datos de una forma no objetiva? O bien, ¿cuál es la sintaxis para llamar a los datos utilizando stdClass?stdClass Problemas de objeto

¿Podría convertir esto a una matriz basada en datos, o incluso dos? Estoy perdido cuando se trata de conjuntos de datos basados ​​en objetos.

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

     ) 

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

     ) 

) 

cuando se crea el objeto por mi cuenta y, a continuación, hacer un var_dump, me sale esto:

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" 
    } 
    } 
} 
+0

¿De dónde viene este objeto? –

+0

Desde esta API, http://emmense.com/sunlight-labs-php-library/ api_key = '[clave de la API]'; echo '

'; print_r($sf->districtsByZipCode(14485)); echo '
'; ?> – ader

Respuesta

14

Ellos son probablemente echando matrices de objetos en su código ($object = (object) $array). Esto tiene la ventaja de que pasará por referencia a partir de ahora (como es el valor predeterminado para los objetos) y la desventaja de que el objeto es completamente inútil (los miembros no pueden comenzar con números - vea el regex in PHP's docs) hasta que lo rechace (PHP lo hace permitir que algunas cosas muy misteriosas):

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

¡Ah, ja! Una vez tuve un problema similar con alguien que usaba etiquetas XML como 'ad-text'; cargarlo en un objeto SimpleXML y tratar de acceder a' $ ad-> ad-text' no funcionaba. – ceejayoz

+0

Esto funciona! ¡Gracias! – ader

+5

En realidad, no hay necesidad de convertir a una matriz ... puede usar el $ object -> {0} -> distrito ... también. – null

4

estoy mirando a su código de ahora, y por desgracia, no he expuesto la opción de su clase para que usted solicite los datos como una matriz asociativa árbol contra un stdClass árbol de objetos.

El "problema" es en la línea 96 en class.sunlightlabs.php

return json_decode($data); 

Usted tiene un par de opciones.

  1. Simplemente use la sintaxis stdClass.
  2. convertir el árbol stdClass regresado en una matriz asociativa uno

# 1 en la acción

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

# 2 en la acción

$result = toArray($result); 

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

También puede trabajar con su clase directamente a través alguna aplicación creativa de patrones, pero ya hacen un uso intensivo de subcatas lo que lo complica un poco, así que me quedaría con una de estas dos soluciones.

+2

Si puede cambiar json_decode ($ data); a json_decode ($ data, TRUE); Entonces la función devolverá una matriz. – null

+0

gracias por la sugerencia get_object_vars que funciona, sin embargo, la sugerencia json_decode ($ data, TRUE) es la mejor solución para este problema. ¡Gracias! –

+0

de acuerdo. json_decode ($ data, TRUE) funcionó muy bien! – Suman

1

Se puede recorrer el objeto de esta manera:

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

Esto funciona, pero no es exactamente lo que estoy buscando. Gracias de cualquier forma. – ader

+0

Me alegra que haya ayudado. No estaba tratando de hacer coincidir exactamente sus necesidades, sino más bien para ayudar a responder su pregunta, "¿cuál es la sintaxis para llamar a los datos usando stdClass?" (así como para demostrar que stdClass es iterable). – GZipp

10

Uso:

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

Básicamente estás corto de corte asignar una cadena a una variable, a continuación, utilizando esa variable como su objeto accesor

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

Este es un hack realmente genial, gracias @null! Me salvó el sueño;) –

0

Esta solución de soulmerge sólo funcionó bien para mí:

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

Muchas gracias !!

1

El usuario 'nulo' sugirió esto en los comentarios, pero quiero ponerlo aquí para que no se pierda tan fácilmente.

La mejor opción es pasar VERDADERO como el segundo parámetro en json_decode, es decir, json_decode ($ data, TRUE) que hace que regrese matrices asociativas en lugar de clases. Entonces, si tiene acceso al código fuente, realice ese cambio.

Cuestiones relacionadas