Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] foreach

Estas en el tema de foreach en el foro de PHP en Foros del Web. me podria al guien, por favor, como puedo extraer los colores de este json? Código: [{ "item1": "si", "item2": "no", "item3": [ { "color": "azul", ...
  #1 (permalink)  
Antiguo 25/02/2017, 04:15
 
Fecha de Ingreso: enero-2008
Ubicación: Valencia
Mensajes: 65
Antigüedad: 16 años, 3 meses
Puntos: 2
foreach

me podria al guien, por favor, como puedo extraer los colores de este json?

Código:
[{
"item1": "si",
"item2": "no",
"item3":
[ 
{
"color": "azul",
"tipo": "circulo"
},
{
"color": "rojo",
"tipo": "triangulo" 
},
{
"color": "verde",
"tipo": "cuadrado"
}
]
}
]
esto es lo que hago y si extraygo el item1 e item2, pero en el item3 me muestra la pabra Array.

Código:
$array = json_decode($data);  

foreach($array as $colors=>$color){
echo "$colors:<br>";
while (list($clave,$valor)=each($color)){
echo "$clave=$valor<br>";

}
}
  #2 (permalink)  
Antiguo 25/02/2017, 09:41
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: foreach

Te muestra eso porque es precisamente un arreglo. En cada iteración del bucle, debes verificar si, la variable evaluada, es un arreglo, por ejemplo, utilizando la función is_array(); de esta manera, si se trata de un arreglo, lo recorres. Lo mejor será que tu función trabaje de forma recursiva.

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 25/02/2017, 10:02
 
Fecha de Ingreso: enero-2008
Ubicación: Valencia
Mensajes: 65
Antigüedad: 16 años, 3 meses
Puntos: 2
Respuesta: foreach

Cita:
Iniciado por Alexis88 Ver Mensaje
Te muestra eso porque es precisamente un arreglo. En cada iteración del bucle, debes verificar si, la variable evaluada, es un arreglo, por ejemplo, utilizando la función is_array(); de esta manera, si se trata de un arreglo, lo recorres. Lo mejor será que tu función trabaje de forma recursiva.


no tengo ni idea de como hacerlo.
con var_dump($array);


Código:
array(1) { [0]=> object(stdClass)#1 (3) 
{ ["item1"]=> string(2) "si"
  ["item2"]=> string(2) "no" 
  ["item3"]=> array(3) 
{ [0]=> object(stdClass)#2 (2) 
{ ["color"]=> string(4) "azul"     
["tipo"]=> string(7) "circulo" }
[1]=> object(stdClass)#3 (2) 
{ ["color"]=> string(4) "rojo"
 ["tipo"]=> string(9) "triangulo" }
 [2]=> object(stdClass)#4 (2) 
{ ["color"]=> string(5) "verde" 
["tipo"]=> string(8) "cuadrado"
 } } } }
gracias
  #4 (permalink)  
Antiguo 25/02/2017, 11:18
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Respuesta: foreach

Ibas bien encaminado, asi es como debes de sacar esos colores;

Código PHP:
$array json_decode($data);  

for(
$i == 0$i <= count($array); $i++) {
   foreach(
$array[$i] as $key =>$value){
      if(
$key == color)
           echo 
$value "<br>";
   }

  #5 (permalink)  
Antiguo 25/02/2017, 14:43
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: foreach

Editado

Al usar la función que mencioné, verificarías en cada iteración si te topaste con un arreglo, de tal manera que, si se trata de uno, lo recorres con un bucle.
Código PHP:
Ver original
  1. $array = json_decode($data);  
  2.  
  3. foreach($array as $colors => $color){
  4.     echo "$colors:<br />";
  5.     while (list($clave,$valor) = each($color)){
  6.         if (is_array($color)){
  7.             foreach($color as $key => $value){
  8.                 echo "$key=$value<br />";
  9.             }
  10.         }
  11.         else{
  12.             echo "$clave=$valor<br />";
  13.         }
  14.     }
  15. }

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 25/02/2017 a las 22:14 Razón: Vamos al grano
  #6 (permalink)  
Antiguo 25/02/2017, 16:00
 
Fecha de Ingreso: enero-2008
Ubicación: Valencia
Mensajes: 65
Antigüedad: 16 años, 3 meses
Puntos: 2
Respuesta: foreach

Cita:
Iniciado por Alexis88 Ver Mensaje
Siendo esa la estructura del arreglo y considerando que, así como hay elementos que también son arreglos, puede haber más elementos internos dentro de los arreglos internos que también sean arreglos; o sea, arreglos dentro de arreglos dentro de arreglos.

Para estos casos, la recursión es precisa:
Código PHP:
Ver original
  1. function printArr($array){
  2.     foreach($array as $key => $value){ //Recorremos el arreglo principal
  3.         if (is_array($value)){ //Si es un arreglo
  4.             echo $key . ': [' . printArr($value) . "\r\n" . ']'; //Se imprime el índice que ocupa y se ejecuta el llamado de la función
  5.         }
  6.         else{ //Caso contrario
  7.             $object = json_decode($value); //Decodificamos la supuesta cadena JSON
  8.             if (!is_null($object)){ //Si lo anterior no es nulo, se trata de un objeto
  9.                 echo $key . ': {' . "\r\n"; //Imprimimos el índice en el que se encuentra
  10.                 foreach ($object as $k => $v){ //Y lo recorremos
  11.                     if (is_array($v)){ //Si el valor es un arreglo
  12.                         echo $k . ': [' . printArr($v) . "\r\n ]"; //Se imprime el índice que ocupa y se ejecuta el llamado de la función
  13.                     }
  14.                     else{ //Caso contrario
  15.                         echo $k . ': ' . $v . "\r\n";   //Se imprime el índice y valor
  16.                     }
  17.                 }
  18.                 echo "\r\n" . '}'; //Se imprime el cierre del objeto
  19.             }
  20.             else{ //Caso contrario
  21.                 echo $key . ': ' . $value . "\r\n"; //Se imprime el índice y valor
  22.             }
  23.         }
  24.     }
  25. }

DEMO

asi es como me lo muestra:

item1: si item2: no color: azul tipo: circulo 0: [ ]color: rojo tipo: triangulo 1: [ ]color: verde tipo: cuadrado 2: [ ]item3: [ ]0: [ ]
  #7 (permalink)  
Antiguo 25/02/2017, 22:14
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: foreach

Hice una edición del código para no redundar tanto e ir al grano. Revísalo.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #8 (permalink)  
Antiguo 26/02/2017, 02:34
 
Fecha de Ingreso: enero-2008
Ubicación: Valencia
Mensajes: 65
Antigüedad: 16 años, 3 meses
Puntos: 2
Respuesta: foreach

Cita:
Iniciado por Alexis88 Ver Mensaje
Hice una edición del código para no redundar tanto e ir al grano. Revísalo.
si @Alexis88, esto me muestra

Código:
item1: si
item2: no
color: azul tipo: circulo 0: [ ]
color: rojo tipo: triangulo 1: [ ]
color: verde tipo: cuadrado 2: [ ]
item3: [ ]
pero colo extraigo solo el rojo por ejemplo?
  #9 (permalink)  
Antiguo 26/02/2017, 12:08
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: foreach

La estructura de lo que tienes, viene siendo lo mismo que el resultado de esto:
Código PHP:
Ver original
  1. $arr = [];
  2.  
  3. $obj1 = new stdClass();
  4. $obj1->item1 = 'sí';
  5. $obj1->item2 = 'no';
  6. $obj1->item3 = [];
  7.  
  8. $obj2 = new stdClass();
  9. $obj2->color = 'azul';
  10. $obj2->tipo = 'círculo';
  11.  
  12. $obj3 = new stdClass();
  13. $obj3->color = 'rojo';
  14. $obj3->tipo = 'triángulo';
  15.  
  16. $obj4 = new stdClass();
  17. $obj4->color = 'verde';
  18. $obj4->tipo = 'cuadrado';
  19.  
  20. array_push($obj1->item3, $obj2, $obj3, $obj4);
  21. $arr[] = $obj1;
Código HTML:
Ver original
  1. Array
  2. (
  3.     [0] => stdClass Object
  4.         (
  5.             [item1] => sí
  6.             [item2] => no
  7.             [item3] => Array
  8.                 (
  9.                     [0] => stdClass Object
  10.                         (
  11.                             [color] => azul
  12.                             [tipo] => círculo
  13.                         )
  14.  
  15.                     [1] => stdClass Object
  16.                         (
  17.                             [color] => rojo
  18.                             [tipo] => triángulo
  19.                         )
  20.  
  21.                     [2] => stdClass Object
  22.                         (
  23.                             [color] => verde
  24.                             [tipo] => cuadrado
  25.                         )
  26.  
  27.                 )
  28.  
  29.         )
  30.  
  31. )

Sabiendo esto, opto por volver a la recursividad para mostrar todos los elementos:
Código PHP:
Ver original
  1. function printArrObj($param){
  2.     if (is_array($param) || is_object($param)){
  3.         foreach ($param as $key => $value){
  4.             if (is_array($value) || is_object($value)){
  5.                 echo $key . ": \n";
  6.                 printArrObj($value);
  7.             }
  8.             else{
  9.                 echo $key . ': ' . $value . "\n";
  10.             }
  11.         }
  12.     }
  13.     else{
  14.         echo 'No se ha proporcionado ningún arreglo u objeto';
  15.     }
  16. }
Obteniendo el siguiente resultado:
Código HTML:
Ver original
  1. 0:
  2. item1: sí
  3. item2: no
  4. item3:
  5. 0:
  6. color: azul
  7. tipo: círculo
  8. 1:
  9. color: rojo
  10. tipo: triángulo
  11. 2:
  12. color: verde
  13. tipo: cuadrado

Básicamente averiguamos en cada iteración si estamos ante un arreglo o un objeto y lo iteramos volviendo a ejecutar la función pero pasándole como argumento al elemento actual en la iteración, caso contrario, imprimimos el índice y valor encontrado.

DEMO

De esta manera se puede mostrar toda la información contenida en el arreglo principal. Ahora, si deseas acceder a un valor en particular, tendrías que guiarte por los índices:
Código PHP:
Ver original
  1. echo 'color: ' . $arr[0]->item3[1]->color; //Se imprime "color: rojo"

__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: foreach
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 02:52.