Foros del Web » Programando para Internet » PHP »

No veo el problema

Estas en el tema de No veo el problema en el foro de PHP en Foros del Web. Partiendo de este código: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original #Años a crear inventario for ( $year = 2011 ; $year <= DATE ( 'Y' ...
  #1 (permalink)  
Antiguo 17/01/2013, 04:27
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
No veo el problema

Partiendo de este código:
Código PHP:
Ver original
  1. #Años a crear inventario
  2. for ($year=2011; $year<=DATE('Y'); $year++) {
  3.    #Tomamos las compras desde el inicio hasta 2011 por empresa
  4.   $compras = $bd->consulta("SELECT claart, claemp, cantidad, fecha FROM compra
  5.   WHERE year(fecha)<=$year GROUP BY   claemp, claart");
  6.    
  7.    /*
  8.    foreach ($compras AS $compra) { //Esto funciona.
  9.         echo $compra['claart'];
  10.         echo "<br />";
  11.    }
  12.    */
  13.  
  14. $cantidad = COUNT($compras); //Me da mas de 60 mil por cada año    
  15.  
  16.     for ($compra=0; $compra <= $cantidad; $compra++) { //Esto no me funciona
  17.         echo COUNT($compras);echo "<br />"; //Sigue dando mas de 60 mil pero se imprime una vez por año
  18.         $claart     = $compras[$compra]['claart'];
  19.         $claemp     = $compras[$compra]['claemp'];
  20.         $cantidad   = $compras[$compra]['cantidad'];
  21.         $fecha      = $compras[$compra]['fecha'];      
  22.         //echo "Artículo $claart claemp $claemp cantidad $cantidad fecha $fecha <br />";
  23.                 //Esta línea anterior se imprime una y sólo una vez por cada bucle. 3 veces porque recorro años de 2011 hasta ahora
  24.     }
  25.    
  26. }

Quería hacerlo con FOR porque tengo entendido que el rendimiento es muy superior a foreach. Sin embargo foreach me gusta mucho porque me parece además de cómodo muy lógico.

Me está fallando el for y no se por qué. La cuestión es que cuando lo escribí la primera vez me iba perfectamente ahora solo me recorre una vez el for. No entiendo por qué

Más raro todavía. Con el for así me imprime los 60 mil holas:
Código PHP:
Ver original
  1. for ($compra=0; $compra <= $cantidad; $compra++) {  
  2.         echo "hola <br />";    
  3.     }

Pero así no. Solo lo hace 1 vez por cada año. 3 en total.
Código PHP:
Ver original
  1. for ($compra=0; $compra <= $cantidad; $compra++) {         
  2.         $claart     = $compras[$compra]['claart'];
  3.         $claemp     = $compras[$compra]['claemp'];
  4.         $cantidad   = $compras[$compra]['cantidad'];
  5.         $fecha      = $compras[$compra]['fecha'];              
  6.         echo "Artículo $claart claemp $claemp cantidad $cantidad fecha $fecha <br />";
  7.     }

No lo entiendo. Nada. Ya está, se puede cerrar. Llevaba mas de una hora con esto sin resultados. Estaba reescribiendo el valor de $cantidad. Mira que busqué y busqué precisamente buscando eso y no lo veía.

Un saludo.

Última edición por alyciashape; 17/01/2013 a las 04:39
  #2 (permalink)  
Antiguo 17/01/2013, 05:47
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: No veo el problema

Cita:
Iniciado por alyciashape Ver Mensaje
Quería hacerlo con FOR porque tengo entendido que el rendimiento es muy superior a foreach. Sin embargo foreach me gusta mucho porque me parece además de cómodo muy lógico.
Ese tipo de optimización no vale la pena. Escribe el código de modo que sea fácil de leer y mantener.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 17/01/2013, 14:06
Avatar de ArkangelGammar  
Fecha de Ingreso: enero-2011
Ubicación: <?php $persona->ubicacion('ArkangelGammar'); ?>
Mensajes: 179
Antigüedad: 13 años, 3 meses
Puntos: 19
Respuesta: No veo el problema

El inconveninente esta aca:

Código PHP:
 $claart     $compras[$compra]['claart'];
        
$claemp     $compras[$compra]['claemp'];
        
$cantidad   $compras[$compra]['cantidad'];
        
$fecha      $compras[$compra]['fecha']; 
Lo estas llamando como si fuese un array de array. Creo que lo logico, dependendiendo de como te devuelva los datos $bd->consulta, seria algo como:

Código PHP:
        $claart     $compras['claart'];
        
$claemp     $compras['claemp'];
        
$cantidad   $compras['cantidad'];
        
$fecha      $compras['fecha']; 
Y en cuanto a los del FOR y Foreach, concuerdo con David, no vale la pena ese tipo de optimizacion, tenes que realizar codigo sencillo y siempre de mantener, y en tu caso utilizaria un foreach, por ahi eso es lo que te esta dando a confucion.

Espero haber ayudado.

Saludos
__________________
"No entiendes algo al menos que seas capaz de explicarselo a tu abuela.
Cada dia sabemos mas....y entendemos menos...."

A. Einstein - Genio mas alla de la razon.

Última edición por ArkangelGammar; 17/01/2013 a las 14:16
  #4 (permalink)  
Antiguo 17/01/2013, 14:54
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años
Puntos: 270
Respuesta: No veo el problema

No, el error ya lo habia encontrado el OP. Estaba usando $cantidad tanto para controlar el bucle, como para guardar 1 campo del resultado.
Pero, si el OP quiere escribir código más "optimizado", primero, no cargues toda la consulta en memoria (aunque php lo hace), cuando se puede procesar secuencialmente sin problema.
Si la query da 60000 resultados, copiar esos 60000 resultados en un array, para luego procesarlos 1 a 1, es tirar la memoria.
Mejor usarlo con un iterador php (mysql_fetch_xx), o con uno que tú te hagas.

Y, después, tanto por velocidad, como por claridad de código:
Código PHP:
Ver original
  1. for ($compra=0; $compra <= $cantidad; $compra++) {          
  2.        $curCompra=$compras[$compra];
  3.         echo "Articulo ".$curCompra['claart'].
  4.                 "claemp  ".$curCompra['claemp'].
  5.                 "cantidad ".$curCompra['cantidad'].
  6.                 "fecha ".$curCompra["fecha"];
  7.      }

Si el procesamiento no requiere parámetros externos (todo lo que haces dentro del bucle depende sólo de los valores de dentro del array) es posible hacerlo con array_map.
Si hay parámetros externos, pero no son demasiados, puedes usar array_map con un closure.(Si son muchos, se pierde legibilidad)
  #5 (permalink)  
Antiguo 17/01/2013, 22:41
Avatar de alvidales  
Fecha de Ingreso: febrero-2012
Mensajes: 108
Antigüedad: 12 años, 2 meses
Puntos: 11
Respuesta: No veo el problema

Cita:
Iniciado por David Ver Mensaje
Ese tipo de optimización no vale la pena. Escribe el código de modo que sea fácil de leer y mantener.
Recomiendo más la utilización de un while.

Etiquetas: Ninguno
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 12:03.