Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Relacionar dos archivos json con php

Estas en el tema de Relacionar dos archivos json con php en el foro de PHP en Foros del Web. Hola, me gustaría saber cómo relacionar dos archivos json que tienen alguna columna en común entre ellos. El primer json: Código PHP: {    "result"  ...
  #1 (permalink)  
Antiguo 12/02/2016, 08:00
 
Fecha de Ingreso: febrero-2009
Mensajes: 44
Antigüedad: 15 años, 2 meses
Puntos: 1
Relacionar dos archivos json con php

Hola, me gustaría saber cómo relacionar dos archivos json que tienen alguna columna en común entre ellos.

El primer json:
Código PHP:
{
  
"result" "ok",
  
"response" : {
    
"state" "Running",
    
"name" "CampeonatosRACE.es",
    
"joinable" false,
    
"max_member_count" 30,
    
"now" 1453996775,
    
"attributes" : {
      
"MaxPlayers" 30,
      
"Race1Length" 19,
      
"TrackId" : -368740158,
      
"VehicleClassId" 1646832695,
      
"VehicleModelId" : -1041674971
      
}
    }

Y el segundo:
Código PHP:
{
  
"result" "ok",
  
"response" : {
    
"description" "All known track ids",
    
"list" : [
      {
        
"id" 328972919,
        
"name" "Cadwell Club Circuit",
        
"gridsize" 20
      
},
      {
        
"id" 354022214,
        
"name" "Donington Park GP",
        
"gridsize" 38
      
},
      {
        
"id" : -368740158,
        
"name" "Autodromo Nazionale Monza Short",
        
"gridsize" 40
      
},
      {
        
"id" 521933422,
        
"name" "Circuit de Barcelona-Catalunya GP",
        
"gridsize" 36
      
}
      ]
   }

Los json los extraigo con curl desde una api externa, y lo que me gustaría hacer es que, cuando presento los datos del primer json, si TrackId = -368740158, que pueda relacionarlo con el segundo json y me diga que el TrackId -368740158 es el circuito "Autodromo Nazionale Monza Short".

Gracias
  #2 (permalink)  
Antiguo 12/02/2016, 08:05
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Relacionar dos archivos json con php

Pues es fácil, usa array_filter() para filtrar efectivamente la lista de la derecha en relación al valor que buscas, tan simple que me extraña que no hayas intentado nada aún.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 12/02/2016, 11:57
 
Fecha de Ingreso: febrero-2009
Mensajes: 44
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Relacionar dos archivos json con php

No hay un emoticono para "Cybertarugo". Lo siento, pero estoy muy perdido, no conocía esta función, soy nuevo en php y estoy aprendiendo a base de palos. He googleado un poco pero no consigo echar a andar la función
  #4 (permalink)  
Antiguo 12/02/2016, 12: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: Relacionar dos archivos json con php

Primero debes convertir dichos JSON a arrays/objetos en PHP ¿eso ya lo resolviste?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 13/02/2016, 02:53
 
Fecha de Ingreso: febrero-2009
Mensajes: 44
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Relacionar dos archivos json con php

Esto es lo que tengo y me lee correctamente ambos json:

Código PHP:
<?php
$c_sala 
curl_init('http://186.37.66.115:9000/api/session/status?participants&sessions&attributes&members ');
curl_setopt($c_salaCURLOPT_RETURNTRANSFERtrue);
$html_sala curl_exec($c_sala);
curl_close($c_sala);

$json_sala json_decode($html_sala);


$c_circuito curl_init('http://186.37.66.115:9000/api/list/tracks');
curl_setopt($c_circuitoCURLOPT_RETURNTRANSFERtrue);
$html_circuito curl_exec($c_circuito);
curl_close($c_circuito);

$json_circuito json_decode($html_circuito);

    
$sala $json_sala->response->name;
    
$estado_sala $json_sala->response->state;
    
$maximo_participantes $json_sala->response->max_member_count;
    
    
$id_circuito $json_sala->response->attributes->TrackId;
    
$estado_sesion $json_sala->response->attributes->SessionState;
    
$duracion_sesion $json_sala->response->attributes->SessionTimeDuration;
    
$tiempo_sesion_transcurrido $json_sala->response->attributes->SessionTimeElapsed;
    
    
$total_participantes sizeof($json_sala->response->members);

    
$nombre_circuito $json_circuito->response->list[0]->name;
    
$id_circuito2 $json_circuito->response->list[0]->id;


    echo 
$nombre_circuito;
    echo 
$sala.'<br>';
    echo 
$estado_sala.'<br>';
    echo 
$id_circuito.'<br>';
    echo 
$id_circuito2.'<br>';
    echo 
$nombre_circuito.'<br>';
    echo 
'Estado de la sesión: '.$estado_sesion.'<br>';
    echo 
'Duración de la sesión: '.$duracion_sesion.'<br>';
    echo 
'Tiempo transcurrido: '.$tiempo_sesion_transcurrido.'<br>';
    echo 
'Participantes: '.$total_participantes.'/'.$maximo_participantes;
?>
De esta forma, como digo, me lee ambos json y todo ok, lo que quiero es que se compare la $id_circuito con $id_circuito2 y si coinciden, que ponga el $nombre_circuito correspondiente.
  #6 (permalink)  
Antiguo 13/02/2016, 10:59
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Relacionar dos archivos json con php

Pues ahí tienes, sólo debes aplicar array_filter() sobre $response->list con una función personalizada que te compare dichos campos:
Código PHP:
Ver original
  1. var_dump(array_filter(function($x) use ($id_circuito) {
  2.   return $x->id == $id_circuito;
  3. }, $response->list));
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 14/02/2016, 03:59
 
Fecha de Ingreso: febrero-2009
Mensajes: 44
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Relacionar dos archivos json con php

Gracias, pero me aparecen varios problemas:

Notice: Undefined variable: response in...
Notice: Trying to get property of non-object in...
Warning: array_filter() expects parameter 1 to be array, object given in...

Cambiando la linea 3 del código que me has pasado por:
Código PHP:
}, $json_circuito->response->list)); 
Sólo me aparece el Warning

Y el var_dump me da NULL
  #8 (permalink)  
Antiguo 14/02/2016, 08:21
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Relacionar dos archivos json con php

Habrá que ver exactamente cómo has colocado el código, porque lo probé y funciona, ¿qué habrás hecho de más?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 14/02/2016, 11:08
 
Fecha de Ingreso: febrero-2009
Mensajes: 44
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Relacionar dos archivos json con php

Pues sinceramente, hice un copia/pega debajo de las variables que ya había creado.
  #10 (permalink)  
Antiguo 14/02/2016, 11:10
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Relacionar dos archivos json con php

Cita:
Iniciado por orcajavi Ver Mensaje
Pues sinceramente, hice un copia/pega debajo de las variables que ya había creado.
Mira, podemos estar todo el día platicando, o bien, podrías mostrar el código completo para entender exactamente lo que hiciste.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 14/02/2016, 12:06
 
Fecha de Ingreso: febrero-2009
Mensajes: 44
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Relacionar dos archivos json con php

Disculpa, no quería molestar

Bueno, el archivo sala.json:
Código PHP:

  
"result" "ok"
  
"response" : { 
    
"state" "Running"
    
"name" "CampeonatosRACE.es"
    
"joinable" false
    
"max_member_count" 30
    
"now" 1453996775
    
"attributes" : { 
      
"MaxPlayers" 30
      
"Race1Length" 19
      
"SessionState" "Race",
      
"SessionTimeElapsed" 0,
      
"SessionTimeDuration" 0,
      
"TrackId" : -368740158
      
"VehicleClassId" 1646832695
      
"VehicleModelId" : -1041674971 
      

    } 


El archivo circuitos.json:
Código PHP:

  
"result" "ok"
  
"response" : { 
    
"description" "All known track ids"
    
"list" : [ 
      { 
        
"id" 328972919
        
"name" "Cadwell Club Circuit"
        
"gridsize" 20 
      
}, 
      { 
        
"id" 354022214
        
"name" "Donington Park GP"
        
"gridsize" 38 
      
}, 
      { 
        
"id" : -368740158
        
"name" "Autodromo Nazionale Monza Short"
        
"gridsize" 40 
      
}, 
      { 
        
"id" 521933422
        
"name" "Circuit de Barcelona-Catalunya GP"
        
"gridsize" 36 
      

      ] 
   } 

Y el código con las 3 líneas que me indicaste en tu mensaje:
Código PHP:
<?php 
$html_sala 
file_get_contents('sala.json');

$json_sala json_decode($html_sala); 


$html_circuito file_get_contents('circuitos.json');

$json_circuito json_decode($html_circuito); 

    
$sala $json_sala->response->name
    
$estado_sala $json_sala->response->state
    
$maximo_participantes $json_sala->response->max_member_count
     
    
$id_circuito $json_sala->response->attributes->TrackId
    
$estado_sesion $json_sala->response->attributes->SessionState
    
$duracion_sesion $json_sala->response->attributes->SessionTimeDuration
    
$tiempo_sesion_transcurrido $json_sala->response->attributes->SessionTimeElapsed

    
$nombre_circuito $json_circuito->response->list[0]->name
    
$id_circuito2 $json_circuito->response->list[0]->id

var_dump(array_filter(function($x) use ($id_circuito) {
  return 
$x->id == $id_circuito;
}, 
$response->list));
    
    echo 
'<br>';
    echo 
$nombre_circuito
    echo 
$sala.'<br>'
    echo 
$estado_sala.'<br>'
    echo 
$id_circuito.'<br>'
    echo 
$id_circuito2.'<br>'
    echo 
$nombre_circuito.'<br>'
    echo 
'Estado de la sesión: '.$estado_sesion.'<br>'
    echo 
'Duración de la sesión: '.$duracion_sesion.'<br>'
    echo 
'Tiempo transcurrido: '.$tiempo_sesion_transcurrido.'<br>';
?>
con este código, en el echo $id_circuito2 y el echo $nombre_circuito, me aparecen el id y nombre del primer array porque entiendo que le pongo list[0] en la variable y que lo que tenemos que conseguir es que ese [0] sea sustituido por el número en el que realmente se encuentra el nombre del circuito que quiero. Eso es lo que entiendo que tenemos que conseguir y lo que creo que me estás dando a entender
  #12 (permalink)  
Antiguo 14/02/2016, 14:31
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Relacionar dos archivos json con php

Pues ya entiendo, se nota que sólo copias y pegas código sin siquiera entender lo que hace.

El problema es que literalmente dejaste el código sin cambios: cuando debiste adaptarlo a las variables que usas.

En el ejemplo yo use $response->list claramente como un ejemplo, no era para que literalmente copies y pegues y todo se solucione.

Bueno, pues en lugar de dejar $response->list debiste cambiarlo a tu variable real de la lista, es decir, $json_circuito->response->list y nada más.

Cita:
Disculpa, no quería molestar
No es molestia, pero ponte un momento en nuestros zapatos ¿tu también sería capaz de orientar a alguien que no dice mucha información y sólo copia/pega código sin razón?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #13 (permalink)  
Antiguo 15/02/2016, 02:41
 
Fecha de Ingreso: febrero-2009
Mensajes: 44
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Relacionar dos archivos json con php

No quiero entrar en discusión, sobre todo porque ni es mi forma de ser y porque agradezco el tiempo que te estás tomando, pero si lees mi segundo post: http://www.forosdelweb.com/f18/relac...9/#post4775885, te indico que precisamente hice ese cambio que dices que tenía que haber hecho y sigue dándome el error que comento en ese mensaje:

Warning: array_filter() expects parameter 1 to be array, object given in...

Así que supongo que algo más falla. Antes de postear siempre intento buscar soluciones y le doy vueltas al código para intentar comprender lo que no entiendo y que los que estáis acostumbrados a programar, dais por hecho.

Nuevamente gracias por tu tiempo.
  #14 (permalink)  
Antiguo 15/02/2016, 03:24
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Relacionar dos archivos json con php

@orcajavi... creo que si miras aqui:
http://php.net/array_filter

Verás el pq de ese fallo! array_filter espera el array, y después el objeto (callable)... y aqui estás pasando primero el objeto (callable) y luego el array ;)
__________________
>> Eleazan's Source
>> @Eleazan
  #15 (permalink)  
Antiguo 15/02/2016, 04:52
 
Fecha de Ingreso: febrero-2009
Mensajes: 44
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Relacionar dos archivos json con php

Gracias, Eleazan. Ahora sí me aparece en qué linea coinciden los dos id:

Código PHP:
var_dump(array_filter($json_circuito->response->list,(function($x) use ($id_circuito) {
  return 
$x->id == $id_circuito;
}))); 
El resultado es:
Código:
array(1) { [2]=> object(stdClass)#8 (3) { ["id"]=> int(-368740158) ["name"]=> string(31) "Autodromo Nazionale Monza Short" ["gridsize"]=> int(40) } }
Vale, ya sé que está en la línea [2]. Ahora lo que he hecho, ha sido quitar el var_dump y poner un foreach para poder escribir las dos lineas que necesito: id y nombre:

Código PHP:
foreach((array_filter($json_circuito->response->list,(function($x) use ($id_circuito) {
  return 
$x->id == $id_circuito;
}))) as 
$id){
    
    
$id_definitivo $id->id;
    
$circuito_definitivo $id->name;
    
    echo 
$id_definitivo;
    echo 
$circuito_definitivo;
    }; 
y con esto, consigo lo que necesitaba, que me indique el nombre del circuito que hay en la sala, sacado de otra tabla.

Muchas gracias a los dos por la ayuda.
  #16 (permalink)  
Antiguo 15/02/2016, 11:32
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Relacionar dos archivos json con php

Cita:
Iniciado por Eleazan Ver Mensaje
Verás el pq de ese fallo! array_filter espera el array, y después el objeto (callable)... y aqui estás pasando primero el objeto (callable) y luego el array ;)
Error mío.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Etiquetas: json, relacionar
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 16:59.