Foros del Web » Programando para Internet » PHP »

Problemas con Array

Estas en el tema de Problemas con Array en el foro de PHP en Foros del Web. ¿Cómo extraer sus datos? Ocurre que su estructura no siempre es la misma. La mayoría de las veces tiene esta estructura: Código: [Comentarios] => Array ...
  #1 (permalink)  
Antiguo 22/03/2005, 04:55
 
Fecha de Ingreso: febrero-2003
Mensajes: 67
Antigüedad: 21 años, 1 mes
Puntos: 0
Problemas con Array

¿Cómo extraer sus datos?

Ocurre que su estructura no siempre es la misma. La mayoría de las veces tiene esta estructura:
Código:
[Comentarios] => Array
                        (
                            [Valoracion] => 5
                            [Comentario] => Array
                                (
                                    [0] => Array
                                        (
                                            [Fecha] => 12/02/2005
                                            [Titulo] => Me ha gustado...
                                            [Descripcion] => bla, bla, bla, bla,...
                                         )
                                     [1] => Array
                                        (
                                            [Fecha] => 15/02/2005
                                            [Titulo] => No me ha gustado...
                                            [Descripcion] => bla, bla, bla, bla,...
                                         )
Pero otras su estructura difiere ligeramente:
Código:
[Comentarios] => Array
                        (
                            [Valoracion] => 5
                            [Comentario] => Array
                                        (
                                            [Fecha] => 09/01/2005
                                            [Titulo] => Me parece genial...
                                            [Descripcion] => bla, bla, bla, bla,...
                                         )
Estoy utilizando un foreach, pero cuando se encuentra con la segunda estructura, no recoge los datos.

¿Alguna sugerencia?
  #2 (permalink)  
Antiguo 22/03/2005, 05:54
Avatar de yoseman  
Fecha de Ingreso: diciembre-2003
Ubicación: Alicante (Spain)
Mensajes: 471
Antigüedad: 20 años, 4 meses
Puntos: 5
Tienes que usar una especie de función recursiva, que dependiendo de sí el valor es un array se llame a si misma.

Sería algo más o menos así, aunque supongo que alguién con más experiencia te podrá ayudar mejor, por ejemplo con el indentado según el nivel del índice:

Código PHP:
function arreglo($arr)
    {
    foreach (
$arr as $key=>$value)
        {
        if (
is_array($value))
            {
            
arreglo ($value);
            }
        else
            {
            print 
$key." -> ".$value."<br>";
            }
        }
    }
arreglo ($a); 
A ver si te sirve de algo...

Salu2 ;)
__________________
[+]
[+]

Última edición por yoseman; 22/03/2005 a las 05:58
  #3 (permalink)  
Antiguo 22/03/2005, 09:40
 
Fecha de Ingreso: febrero-2003
Mensajes: 67
Antigüedad: 21 años, 1 mes
Puntos: 0
Lo he probado y funciona. Recoje perfectamente los datos independientemente de la estructura del array.

Pero ahora no se como incorporar su contenido formateado a mi web, teniendo en cuenta que no deseo imprimir el nombre de las $key sino sólo el valor de algunas.

Sólo necesito el valor de fecha, titulo y descripcion del apartado comentario.
He estado haciendo pruebas pero no lo consigo.
  #4 (permalink)  
Antiguo 22/03/2005, 09:53
Avatar de yoseman  
Fecha de Ingreso: diciembre-2003
Ubicación: Alicante (Spain)
Mensajes: 471
Antigüedad: 20 años, 4 meses
Puntos: 5
Puedes poner una condición relativa a los nombres de los índices, por ejemplo:

Código PHP:
function arreglo($arr)
    {
    
$indices_validos=array('Fecha''Titulo''Descripcion');
    foreach (
$arr as $key=>$value)
        {
        if (
is_array($value))
            {
            
arreglo ($value);
            }
        elseif (
in_array($key,$indices_validos))
            {
            print 
$key." : ".$value."<br>";
            }
        }
    } 
Creo que debería de funcionar ...

Bueno y ya después de ésto, si no quieres que salga el índice simplemente lo quitas en el print:

Código PHP:
            print $value."<br>"
Salu2 ;)
__________________
[+]
[+]

Última edición por yoseman; 22/03/2005 a las 10:00
  #5 (permalink)  
Antiguo 22/03/2005, 10:00
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 21 años, 8 meses
Puntos: 8
Establece un if() dentro de esa funcion. Comparando si $key == a alguna de las claves que quieres, que se imprima. O mejor aun crear un array temporal y luego devolverlo con return.

Es funcion que te dio yoseman es una base muy buena desde donde empesar, y si dices "Sólo necesito el valor de fecha, titulo y descripcion del apartado comentario.
" entonces solo tienes que establecer condiciones.
if($key == "algo" || $key == "otro algo"), etc.

|| significa 'o'

Saludos
  #6 (permalink)  
Antiguo 22/03/2005, 10:24
 
Fecha de Ingreso: febrero-2003
Mensajes: 67
Antigüedad: 21 años, 1 mes
Puntos: 0
Ya lo siento, pero no termino de coger la idea.

Todo lo que comentais funciona, pero yo no estoy acostumbrado a trabajar con foreach $arr as $key =>$value. Solía hacerlo con foreach $arr as $x

Vamos a ver, yo deseo imprimir lo siguiente:
Código:
print "<p><b>".$key['Titulo']=ucfirst($key['Titulo'])."</b><br>Fecha: "
			.$key['Fecha']. "<br>".$key['Descripcion']. 
	        "</p><hr color=\"#003366\" size=\"1\">";
Pero no se donde ha de ir este código, tampoco estoy seguro si debe ser $key o $arr
  #7 (permalink)  
Antiguo 22/03/2005, 10:29
 
Fecha de Ingreso: agosto-2002
Ubicación: Colón - Entre Rios - Argentina
Mensajes: 647
Antigüedad: 21 años, 8 meses
Puntos: 8
$key es el indice del array, y $value el valor.
EJ:
Código PHP:
$array['indice'] = "valor"// se autoexplica no? jejeje 
Cita:
Solía hacerlo con foreach $arr as $x
$x equivaldria entonces a $value.
  #8 (permalink)  
Antiguo 22/03/2005, 10:45
 
Fecha de Ingreso: febrero-2003
Mensajes: 67
Antigüedad: 21 años, 1 mes
Puntos: 0
No hay manera de hacerlo funcionar.

Este es el código:
Código:
<?
	 function arreglo($arr) 
    {
	$indices_validos=array('Titulo', 'Fecha', 'Descripcion'); 
    foreach ($arr as $key=>$value) 
        { 
        if (is_array($value)) 
            { 
            arreglo ($value); 
            } 
        elseif (in_array($key,$indices_validos))  
            { 
			
            print "<p><b>".$value['Titulo']=ucfirst($value['Titulo'])."</b><br>Date: "
			.$value['Fecha']."<br>".$value['Descripcion']. 
	        "</p><hr color=\"#003366\" size=\"1\">"; 
            } 
        } 
    } 
arreglo ($items['Comentarios']['Comentario']);
?>
¿Qué falla?

Última edición por wood; 22/03/2005 a las 10:48
  #9 (permalink)  
Antiguo 22/03/2005, 11:02
Avatar de yoseman  
Fecha de Ingreso: diciembre-2003
Ubicación: Alicante (Spain)
Mensajes: 471
Antigüedad: 20 años, 4 meses
Puntos: 5
Prueba esto a ver si no me he liado :

Código PHP:
<?
$a
['Valoracion']=5;
$a['Comentario']['Fecha']="09/01/2005";
$a['Comentario']['Titulo']="Me parece genial...";
$a['Comentario']['Descripcion']="bla, bla, bla, bla,...";
$b['Valoracion']=5;
$b['Comentario'][0]['Fecha']="09/01/2005";
$b['Comentario'][0]['Titulo']="Me parece genial...";
$b['Comentario'][0]['Descripcion']="bla, bla, bla, bla,...";
$b['Valoracion']=5;
$b['Comentario'][1]['Fecha']="09/01/2005";
$b['Comentario'][1]['Titulo']="Me parece genial...";
$b['Comentario'][1]['Descripcion']="bla, bla, bla, bla,...";
$b['Valoracion']=5;
$b['Comentario'][2]['Fecha']="09/01/2005";
$b['Comentario'][2]['Titulo']="Me parece genial...";
$b['Comentario'][2]['Descripcion']="bla, bla, bla, bla,...";
$b['Valoracion']=5;
$b['Comentario'][3]['Fecha']="09/01/2005";
$b['Comentario'][3]['Titulo']="Me parece genial...";
$b['Comentario'][3]['Descripcion']="bla, bla, bla, bla,...";

 function 
arreglo($arr)
    {
    
$indices_validos=array('Fecha''Titulo''Descripcion');
    foreach (
$arr as $key=>$value)
        {
        if (
is_array($value))
            {
            
arreglo ($value);
            }
        elseif (
in_array($key,$indices_validos))
            {
            
$nuevo[$key]=$value;
            
$contador++;
            if (
$contador==3)
                {                print
"<p><b>".$nuevo['Titulo']=ucfirst($nuevo['Titulo'])."</b><br>Fecha:".$nuevo['Fecha']."<br>".$nuevo['Descripcion']."</p><hr color=\"#003366\" size=\"1\">";
                
$contador=0;
                }
            }

        
        }
    } 
print 
"<br /><br /><u>Array tipo 1</u><br /><br/>";
arreglo($a);
print 
"<br /><br /><u>Array tipo 2</u><br /><br/>";
arreglo($b);
?>
He definido unos ejemplos de array para ver si funcionaba...

A ver si hay suerte y te sirve. Lo mismo alguién hay alguna forma mejor de hacerlo menos liosa :S

Lo que falla en tu prueba es que el foreach va iterando sobre el array y con eso que has puesto no te serviría, porque tu no quieres mostrar los datos a la 1 vuelta ni a la segundo, sino a la tercera. La forma de solucionarlo es poner un contador que a la tercera se resetee además de mostrar los datos, más o menos...


Salu2 ;)
__________________
[+]
[+]

Última edición por yoseman; 22/03/2005 a las 11:09
  #10 (permalink)  
Antiguo 23/03/2005, 03:45
 
Fecha de Ingreso: febrero-2003
Mensajes: 67
Antigüedad: 21 años, 1 mes
Puntos: 0
Gracias a los dos.

Pero finalmente he conseguido solucionarlo de otro modo y adecuarlo perfectamente a mis necesidades.
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 19:20.