Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Object(stdClass) devuelto por la API de Twitter

Estas en el tema de Object(stdClass) devuelto por la API de Twitter en el foro de PHP en Foros del Web. Estoy trabajando con la API de Twitter. Anteriormente logré hacer login con dicha API. Para ello la API me envía un Object(stdClass) pero monodimensional o ...
  #1 (permalink)  
Antiguo 17/09/2013, 17:02
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Object(stdClass) devuelto por la API de Twitter

Estoy trabajando con la API de Twitter. Anteriormente logré hacer login con dicha API. Para ello la API me envía un Object(stdClass) pero monodimensional o de una sola dimensión y eso lo solucioné recorriendo dicho objeto como si fueran los métodos de una clase.

Código PHP:
Ver original
  1. $content->clave del valor;

Ahora que solicito los datos de followers/ids y friends/ids me retorna en ambos casos un Object(stdClass) pero de varias dimensiones. El problema es que alterna claves indexadas con claves referenciadas y para peor desconozco el número de dimensiones totales que contiene dicho Object(stdClass).

Por lo tanto mis preguntas son

¿Cómo puedo saber la totalidad de sus dimensiones? (en la documentación de la API no lo dicen).

¿Cómo puedo recorrer dicho Object (stdClass) para extraer los datos que necesito? (el 99% de los datos que me arroja no los necesito, en este caso se pueden considerar despreciables).

¿Cual es la manera correcta de recorrer los Object(stdClass) y trabajar con ellos?

¿Los Object(stdClass) se pueden tratar como arrays?

¿Si no se pueden tratar como arrays, entonces qué funciones se les pueden aplicar para trabajar con ellos?

He buscado en la documentación de PHP y lo cierto es que respecto a este asunto es muy escasa, un par de líneas sobre ello y ya no hay nada más.

Estoy abierto a todo tipo de sugerencias y aportes sobre el asunto.
__________________
Ayúdame a hacerlo por mi mismo.
  #2 (permalink)  
Antiguo 17/09/2013, 17:06
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Object(stdClass) devuelto por la API de Twitter

Todas esas incógnitas se resuelven aplicando la misma solución: recursividad.

Como sea, un array u objeto es un contenedor de propiedades, clave/valor, etc. por lo tanto se pueden iterar con foreach() de manera sencilla.

De ahí a que sepas exactamente por dónde empezar o hasta dónde iterar ya tiene que ver con la estructura lógica de control que plantees, y sobre todo eso debe considerarse en la solución recursiva que apliques.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 17/09/2013, 17:15
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Object(stdClass) devuelto por la API de Twitter

No entiendo muy bien a qué te refieres con recursividad.

¿Puedes explicármelo u ofrecerme un enlace?

Iba a editar el post para añadir un ejemplo real de estructura pero con los valores cambiados por ****, pero te me adelantastes :D

Código PHP:
Ver original
  1. object(stdClass)#1 (5) {
  2.  ["users"]=>
  3.   array(20) {
  4.     [0]=>
  5.     object(stdClass)#2 (38) {
  6.      ["id"]=>
  7.       int(****)
  8.       ["id_str"]=>
  9.       string(10) "****"
  10.       ["name"]=>
  11.       string(15) "****"
  12.       ["screen_name"]=>
  13.       string(11) "****"
  14.       ["location"]=>
  15.       string(0) ""
  16.       ["description"]=>
  17.       string(0) ""
  18.       ["url"]=>
  19.       NULL
  20.       ["entities"]=>
  21.       object(stdClass)#3 (1) {
  22.        ["description"]=>
  23.         object(stdClass)#4 (1) {
  24.          ["urls"]=>
  25.           array(0) {
  26.           }
  27.         }
  28.       }
  29.       ["protected"]=>
  30.       bool(false)
  31.       ["followers_count"]=>
  32.       int(****)
  33.       ["friends_count"]=>
  34.       int(1)
  35.       ["listed_count"]=>
  36.       int(1)
  37.       ["created_at"]=>
  38.       string(30) "Sun Apr 21 17:01:38 +0000 2013"
  39.       ["favourites_count"]=>
  40.       int(0)
  41.       ["utc_offset"]=>
  42.       NULL
  43.       ["time_zone"]=>
  44.       NULL
  45.       ["geo_enabled"]=>
  46.       bool(false)
  47.       ["verified"]=>
  48.       bool(false)
  49.       ["statuses_count"]=>
  50.       int(0)
  51.       ["lang"]=>
  52.       string(2) "es"
  53.       ["contributors_enabled"]=>
  54.       bool(false)
  55.       ["is_translator"]=>
  56.       bool(false)
  57.       ["profile_background_color"]=>
  58.       string(6) "C0DEED"
  59.       ["profile_background_image_url"]=>
  60.       string(48) "****"
  61.       ["profile_background_image_url_https"]=>
  62.       string(49) "****"
  63.       ["profile_background_tile"]=>
  64.       bool(false)
  65.       ["profile_image_url"]=>
  66.       string(89) "****"
  67.       ["profile_image_url_https"]=>
  68.       string(91) "****"
  69.       ["profile_link_color"]=>
  70.       string(6) "0084B4"
  71.       ["profile_sidebar_border_color"]=>
  72.       string(6) "C0DEED"
  73.       ["profile_sidebar_fill_color"]=>
  74.       string(6) "DDEEF6"
  75.       ["profile_text_color"]=>
  76.       string(6) "333333"
  77.       ["profile_use_background_image"]=>
  78.       bool(true)
  79.       ["default_profile"]=>
  80.       bool(true)
  81.       ["default_profile_image"]=>
  82.       bool(false)
  83.       ["following"]=>
  84.       bool(true)
  85.       ["follow_request_sent"]=>
  86.       bool(false)
  87.       ["notifications"]=>
  88.       bool(false)
  89.     }

Evidentemente es solo un trozo de un largo texto que mide como 20 veces este trozo.

Gracias!
__________________
Ayúdame a hacerlo por mi mismo.
  #4 (permalink)  
Antiguo 17/09/2013, 17:18
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Object(stdClass) devuelto por la API de Twitter

Cita:
Iniciado por guardarmicorreo Ver Mensaje
No entiendo muy bien a qué te refieres con recursividad.
Me extraña que seas programador y no hayas manejado jamás la recursividad, es un tema bastante básico, o hasta fundamental.

Te sugiero comenzar por ahí, no tengo ningún enlace a la mano pero nada cuesta investigar.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 17/09/2013, 17:23
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Object(stdClass) devuelto por la API de Twitter

Cita:
Iniciado por pateketrueke Ver Mensaje
Me extraña que seas programador y no hayas manejado jamás la recursividad, es un tema bastante básico, o hasta fundamental.

Te sugiero comenzar por ahí, no tengo ningún enlace a la mano pero nada cuesta investigar.
¿Te lo puedes creer? No me ha hecho falta hasta ahora :D

EDITO

Por curiosidad ¿No te estarás refiriendo a la recursividad de funciones no?
__________________
Ayúdame a hacerlo por mi mismo.
  #6 (permalink)  
Antiguo 17/09/2013, 17:27
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Object(stdClass) devuelto por la API de Twitter

Efectivamente, con recursividad me refiero a cuando una método/función se llama a si misma para resolver un problema concreto.

Si lo piensas eso es lo que necesitas, una función que analice los IDs de cierta estructura, y si debajo hay una estructura similar entonces aplicar recursividad, etc.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 17/09/2013, 17:32
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Object(stdClass) devuelto por la API de Twitter

Cita:
Iniciado por pateketrueke Ver Mensaje
Efectivamente, con recursividad me refiero a cuando una método/función se llama a si misma para resolver un problema concreto.

Si lo piensas eso es lo que necesitas, una función que analice los IDs de cierta estructura, y si debajo hay una estructura similar entonces aplicar recursividad, etc.
Ahhh! ok! no entendía muy bien a qué te referías. Estaba pensando por un momento que el Object(stdClass) era una especie de función que se resolvía a si sola.

Siento mi torpeza, llevo todo el día detrás del PC, ya la cabeza me baila :D

Entonces lo que me recomiendas es tratar el Object(stdClass) como si fuera un array, por lo tanto recorrerlo con un foreach o un for entrando solo en las estructuras de las cuales me interese extraer datos ¿no?

Sino creo que no te entendí.

(Gracias por tu ayuda!! :D )
__________________
Ayúdame a hacerlo por mi mismo.
  #8 (permalink)  
Antiguo 17/09/2013, 17:33
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Object(stdClass) devuelto por la API de Twitter

Si te es mas facil recorrer Arreglos puedes usar una pequeña funcion:

Código PHP:
Ver original
  1. function objectToArray($object)
  2.     {
  3.         if (is_object($object)) {
  4.             $object = get_object_vars($object);
  5.         }
  6.        
  7.         if (is_array($object)) {
  8.             return array_map(__FUNCTION__, $object);
  9.         }
  10.         else {
  11.             return $object;
  12.         }
  13.     }

Con eso de una stdClass multidimensional lograrias tener un arreglo.
Luego si los sabes recorrer podrias obtener los datos.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #9 (permalink)  
Antiguo 17/09/2013, 17:34
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Object(stdClass) devuelto por la API de Twitter

De entrada el objeto es iterable pero no hace falta iterarlo.

Lo que se debe iterar es la propiedad en cuestión y así sucesivamente.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 17/09/2013, 17:40
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Object(stdClass) devuelto por la API de Twitter

Cita:
Iniciado por portalmana Ver Mensaje
Si te es mas facil recorrer Arreglos puedes usar una pequeña funcion:

Código PHP:
Ver original
  1. function objectToArray($object)
  2.     {
  3.         if (is_object($object)) {
  4.             $object = get_object_vars($object);
  5.         }
  6.        
  7.         if (is_array($object)) {
  8.             return array_map(__FUNCTION__, $object);
  9.         }
  10.         else {
  11.             return $object;
  12.         }
  13.     }

Con eso de una stdClass multidimensional lograrias tener un arreglo.
Luego si los sabes recorrer podrias obtener los datos.

Saludos
Muchas gracias por tu respuesta. Pero pienso que si hay una manera de hacerlo que no implique convertirlo en array pues mejor. Pero gracias por tu aporte!

Cita:
Iniciado por pateketrueke Ver Mensaje
De entrada el objeto es iterable pero no hace falta iterarlo.

Lo que se debe iterar es la propiedad en cuestión y así sucesivamente.
Supongamos que del ejemplo anterior quiero acceder a la propiedad URLS que se encuentra en la línea 24. Para ello ¿tendría que hacerlo así?

Código PHP:
Ver original
  1. $result = $content->users->entities->description->urls;
__________________
Ayúdame a hacerlo por mi mismo.
  #11 (permalink)  
Antiguo 17/09/2013, 17:54
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Object(stdClass) devuelto por la API de Twitter

La propiedad users es un array, por lo tanto debes acceder primero al índice en cuestión o iterar desde ahí.

Lo mejor es que vayas haciendo var_dump() de cada variable mientras profundizas, no hace falta pedirnos permiso para depurar por tu cuenta.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 17/09/2013, 17:59
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 11 años, 5 meses
Puntos: 84
Respuesta: Object(stdClass) devuelto por la API de Twitter

Cita:
Iniciado por pateketrueke Ver Mensaje
La propiedad users es un array, por lo tanto debes acceder primero al índice en cuestión o iterar desde ahí.
gracias! lo probaré!

Cita:
Lo mejor es que vayas haciendo var_dump() de cada variable mientras profundizas, no hace falta pedirnos permiso para depurar por tu cuenta.
jajaja ok :D
__________________
Ayúdame a hacerlo por mi mismo.

Etiquetas: api, twitter
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:53.