Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Problema con arrays asociativos/dinamicos

Estas en el tema de Problema con arrays asociativos/dinamicos en el foro de PHP en Foros del Web. Hola a todos, en primer lugar indicar que soy nuevo por estos lares y aunque llevo mucho tiempo consultado el foro, nunca me había animado ...
  #1 (permalink)  
Antiguo 03/05/2013, 02:19
 
Fecha de Ingreso: mayo-2013
Ubicación: Mostoles
Mensajes: 4
Antigüedad: 10 años, 11 meses
Puntos: 0
Problema con arrays asociativos/dinamicos

Hola a todos,
en primer lugar indicar que soy nuevo por estos lares y aunque llevo mucho tiempo consultado el foro, nunca me había animado a postear algo, ya que casi siempre encontraba solución a mis problemillas con php ^^ (sois unos maquinas )

En fin, el caso que me tiene atascado es que intento genear unos graficos con la API de GoogChart, pero a la hora de recuperar los datos de una bbdd en mysql, soy incapaz de montar el segundo sub array. Se donde está el problema y he probado muchas variantes que he encontrado tanto en este foro, como en otras web, pero no consigo solventarlo. Os pego el codigo:

Código PHP:
<?php
    
function mostrarMatriz($tabla,$campoCondicional,$campoValor)
    {
           include (
"../properties/dbData.php");
        include (
"../sql/conndb.php");
        
$tablahtmlspecialchars($tabla);
        
$campoCondicionalhtmlspecialchars($campoCondicional);
        
$campoValorhtmlspecialchars($campoValor);
        if( 
$campoCondicional !="" && $campoValor !="")
        {
            
$Condicional "WHERE $campoCondicional = '$campoValor' "
        }
        
$sql"SELECT * FROM $tabla $Condicional";
        
$matriz_db mysql_query($sql$conn) or die(mysql_error());
        for(
$i=0;$filamysql_fetch_assoc($matriz_db); $i++)
        { 
            for(
$a0;$a<mysql_num_fields($matriz_db);$a++)
            {
                
$campo mysql_field_name($matriz_db,$a);
                
$retorno[$i][$campo] = $fila[$campo];
            }
        };
        
mysql_close($conn);
        return 
$retorno;
    }
    function 
subMatriz($jca)
    {
        array
        (
            for(
$i=0; isset($jca[$i]) != null$i++)
            {
                
$jca[$i]['chtime'] => $jca[$i]['chnc']
            }
        ),
    }
    
$chfecha "01/04/2013";
    
$matrizJca2302 mostrarMatriz('tbl_conhost','chport','JCA_2302');
    
$matrizJca2002 mostrarMatriz('tbl_conhost','chport','JCA_2002');
        include( 
"./GoogChart.class.php");
    
$chart = new GoogChart( );
    
$color = array( '#ff0000''#00ff00''#0000ff',);
    
$dataTimeline = array
    ( 
        
'JCA_2002' => subMatriz($matrizJca2002),
        
'JCA_2302' => subMatriz($matrizJca2302),
    );
    
$chart->setChartAttrs( array(
        
'type' => 'sparkline',
        
'title' => $chfecha,
        
'data' => $dataTimeline,
        
'size' => array( 850300 ),
        
'color' => $color,
        
'labelsXY' => true,
        
'fill' => array( '#ffffff'),
    ));
    echo 
$chart;
?>
Obviamente esto provoca un error sintactico:

Código:
[Fri May 03 10:07:29 2013] [error] [client 127.0.0.1] PHP Parse error:  syntax error, unexpected T_FOR, expecting ')' in /var/www/apps/tags/graphsModule/graph.php on line 30
Pero creo que sirve para indicaros cual es mi intención para montar el segundo array, aunque no soy capaz de encontrar una forma de hacerlo, espero que a alguno de vosotros si ^^

Muchas gracias por adelantado

Última edición por angahision; 03/05/2013 a las 02:46 Razón: Corrección ortográfica
  #2 (permalink)  
Antiguo 03/05/2013, 03:15
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Problema con arrays asociativos/dinamicos

Tendrías que explicar un poco mejor qué quieres conseguir para que te podamos ayudar.
Salu2
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 03/05/2013, 03:38
 
Fecha de Ingreso: mayo-2013
Ubicación: Mostoles
Mensajes: 4
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Problema con arrays asociativos/dinamicos

Hola,
lo que intento, es montar la variable $dataTimeline que le paso a la API de GoogChart con los datos del grafico.
Dichos datos, montados a mano, deberían quedar así (esto funciona sin problemas y monta el grafico):

Código PHP:
$dataTimeline = array( 
    
'JCA_3002' => array(
        
'00:00' => '23',
        
'01:00' => '3',
        
'02:00' => '43',
        
'03:00' => '35',
        
'04:00' => '37',
        
'05:00' => '12',
        
'06:00' => '6',
        
'07:00' => '10',
        
'08:00' => '15',
        
'09:00' => '10',
        
'10:00' => '13',
        
'11:00' => '19',
        
'12:00' => '23',
        
'13:00' => '0',
        
'14:00' => '0',
        
'15:00' => '0',
        
'16:00' => '0',
        
'17:00' => '3',
        
'18:00' => '9',
        
'19:00' => '20',
        
'20:00' => '34',
        
'21:00' => '24',
        
'22:00' => '21',
        
'23:00' => '16',
    ),
    
'JCA_3012' => array(
        
'00:00' => '0',
        
'01:00' => '5',
        
'02:00' => '0',
        
'03:00' => '0',
        
'04:00' => '0',
        
'05:00' => '0',
        
'06:00' => '3',
        
'07:00' => '0',
        
'08:00' => '0',
        
'09:00' => '0',
        
'10:00' => '0',
        
'11:00' => '0',
        
'12:00' => '0',
        
'13:00' => '2',
        
'14:00' => '3',
        
'15:00' => '6',
        
'16:00' => '9',
        
'17:00' => '13',
        
'18:00' => '5',
        
'19:00' => '0',
        
'20:00' => '0',
        
'21:00' => '0',
        
'22:00' => '0',
        
'23:00' => '0',
    ),
); 
La cuestión, es que esos datos (Ej '19:00' => '0') los tengo almacenados en una bbdd y no soy capaz de montar ese segundo array de forma dinámica.

En bbdd se almacenan de la siguiente forma

Código:
JCA_3002 | 23  | 00:00 | 01/04/2013 | MaquinaX
JCA_3012 | 0   | 00:00 | 01/04/2013 | MaquinaX
JCA_3002 | 3   | 01:00 | 01/04/2013 | MaquinaX
JCA_3012 | 5   | 01:00 | 01/04/2013 | MaquinaX
JCA_3002 | 43  | 02:00 | 01/04/2013 | MaquinaX
JCA_3012 | 0   | 02:00 | 01/04/2013 | MaquinaX
etc.
La FUNCION mostrarMatriz, recupera correctamente los datos filtrados por el primer campo y el FOR de la FINCION subMatriz, si en lugar de intentar montar el array hago un ECHO de los 2 valores a recuperar, saca correctamente por pantalla toda las iteraciones, mostrando todos los datos almacenados.

Si necesitais alguna aclaración más decirmelo.

Muchas gracias.
  #4 (permalink)  
Antiguo 03/05/2013, 04:16
Avatar de zalito12  
Fecha de Ingreso: noviembre-2011
Ubicación: Coruña, España
Mensajes: 430
Antigüedad: 12 años, 5 meses
Puntos: 67
Respuesta: Problema con arrays asociativos/dinamicos

No sé muy bien que pretendes, pero creo que el error da por aquí:
Código PHP:
Ver original
  1. function subMatriz($jca)
  2.     {
  3.         array
  4.         (
  5.             for($i=0; isset($jca[$i]) != null; $i++)
  6.             {
  7.                 $jca[$i]['chtime'] => $jca[$i]['chnc']
  8.             }
  9.         ),
  10.     }

no sé si para ti tiene algún sentido eso, para mi desde luego no, ¿un bucle dentro de un array?
__________________
Dicen que las personas piensan en su lengua materna, yo lo hago en PHP
  #5 (permalink)  
Antiguo 03/05/2013, 04:42
 
Fecha de Ingreso: mayo-2013
Ubicación: Mostoles
Mensajes: 4
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Problema con arrays asociativos/dinamicos

Efectivamente ese es el problema, es una de las muchas pruebas que he hecho para intentar rellenar ese array, lo deje así porque pensaba que era mas facil de ver lo que pretendía conseguir.

El problema es que no se como montar ese array, para que quede como el ejemplo que he puesto en el segunto post rellenado a mano.

Salu2.
  #6 (permalink)  
Antiguo 03/05/2013, 05:31
Avatar de zalito12  
Fecha de Ingreso: noviembre-2011
Ubicación: Coruña, España
Mensajes: 430
Antigüedad: 12 años, 5 meses
Puntos: 67
Respuesta: Problema con arrays asociativos/dinamicos

Pues lo podrias hacer facilmente con un bucle foreach, pero viendo tu código y tus dudas me parece que tienes algún problema para entender algunas cosas, por ejemplo, en tu código pones:
Código PHP:
Ver original
  1. $dataTimeline = array
  2.     (
  3.         'JCA_2002' => subMatriz($matrizJca2002),
  4.         'JCA_2302' => subMatriz($matrizJca2302),
  5.     );
Pero subMatriz() no tiene ningún return, así que si no devuelve nada no lo puedes poner en una asignación.

Eso entre otras cosas, no he buceado mucho en tu código, pero a lo mejor podrías generar ese array sin complicarte tanto, no sé.
Si el array que le pasas a la función fuese de este tipo:
Código PHP:
Ver original
  1. array('00:00' => '23', '01:00' => '3', etc);
lo podrías solucionar con una función así:
Código PHP:
Ver original
  1. function subMatriz($jca){
  2.     $array = array();
  3.     foreach($jca as $clave => $valor){
  4.         $array[$clave] = $valor;
  5.     }
  6.     return $array;
  7. }

Ahora, como no tengo mucha idea de como está construido el array que le pasas, pues ni idea, si hicieses un var_dump() de $matrizJca2002, o $matrizJca2303, sería más fácil ayudarte.

Suerte
__________________
Dicen que las personas piensan en su lengua materna, yo lo hago en PHP
  #7 (permalink)  
Antiguo 03/05/2013, 10:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Problema con arrays asociativos/dinamicos

Puedes generar todo desde el mismo array, si los datos son los que pones en la tabla puedes generar tu array así:
Código PHP:
Ver original
  1. $timeline = array();
  2. while ($row = mysql_fetch_row($result)) {
  3.          $jc = $row[0];
  4.          $hora = $row[1];
  5.          $num = $row[2];
  6.  
  7.          if (!isset($timeline[$jc])) $timeline[$jc] = array();
  8.  
  9.          $timeline[$jc][$hora] = $num;
  10. }
  11.  
  12. var_dump($timeline);

Saludos.
  #8 (permalink)  
Antiguo 05/05/2013, 23:37
 
Fecha de Ingreso: mayo-2013
Ubicación: Mostoles
Mensajes: 4
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Problema con arrays asociativos/dinamicos

Muchas gracias a todos por vuestras respuestas y en especia a GatorV, estaba empeñado en liarme con el "mysql_fetch_assoc" para cargar los datos en el array, cuando era mucho mas facil hacerlo con el tradicional "mysql_fetch_row". Normalmente lo mas sencillo suele ser lo mejor ^^

Tras una pequeña modificación que he hecho para cambiar uno de los ejes del grafico (es decir, cambiado la variable $num por la de $hora al montar la matriz), el codigo así funciona perfectamente y monta el grafico como necesito:

Código PHP:
<?php
    
function mostrarMatriz($tabla,$campoCondicional,$campoValor)
    {
        include (
"../properties/dbData.php");
        include (
"../sql/conndb.php");
        
$tablahtmlspecialchars($tabla);
        
$campoCondicionalhtmlspecialchars($campoCondicional);
        
$campoValorhtmlspecialchars($campoValor);
        if( 
$campoCondicional !="" && $campoValor !="")
        {
            
$campoCondicional "WHERE $campoCondicional = '$campoValor' "
        }
        
$sql"SELECT * FROM $tabla $campoCondicional";
        
$result mysql_query($sql$conn) or die(mysql_error());
        
$timeline = array();
        while (
$row mysql_fetch_row($result))
        {
            
$jc $row[0];
            
$hora $row[1];
            
$num $row[2];
        if (!isset(
$timeline[$jc])) $timeline[$jc] = array();
        
$timeline[$jc][$num] = $hora;
        }
//        var_dump($timeline);
        
mysql_close($conn);
        return 
$timeline;
    }
    
$chfecha "01/04/2013";
    include( 
"./GoogChart.class.php");
    
$chart = new GoogChart( );
    
$color = array( '#ff0000''#00ff00''#0000ff',);
    
$dataTimeline mostrarMatriz('tbl_conhost','','');
    
$chart->setChartAttrs( array(
        
'type' => 'sparkline',
        
'title' => $chfecha,
        
'data' => $dataTimeline,
        
'size' => array( 850350 ),
        
'color' => $color,
        
'labelsXY' => true,
        
'fill' => array( '#ffffff'),
    ));
    echo 
$chart;
?>
De nuevo muchas gracias a todos.

Salu2.

Etiquetas: arrays, html, mysql, select, sql, tabla
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 22:51.