Foros del Web » Programando para Internet » PHP »

Arrays - agrupar y sumar

Estas en el tema de Arrays - agrupar y sumar en el foro de PHP en Foros del Web. Amigos: Tengo registros de pedidos en una tabla donde los productos están compuestos por PRODUCTO|CANTIDAD. Pedido 1 Producto1 | Cantidad 2 Pedido 2 Producto1 | ...
  #1 (permalink)  
Antiguo 25/04/2014, 08:13
Avatar de armandoweb  
Fecha de Ingreso: enero-2003
Ubicación: San Cristobal, Santa Fe, Argentina
Mensajes: 544
Antigüedad: 21 años, 3 meses
Puntos: 7
Arrays - agrupar y sumar

Amigos:

Tengo registros de pedidos en una tabla donde los productos están compuestos por PRODUCTO|CANTIDAD.

Pedido 1
Producto1 | Cantidad 2

Pedido 2
Producto1 | Cantidad 1
Producto2 | Cantidad 2

Pedido 3
Producto1 | Cantidad 1
Producto2 | Cantidad 1

Lo que intento hacer es agrupar los productos y sumar las cantidades, para que me quede de la siguiente forma:

Producto1 | Cantidad 4
Producto2 | Cantidad 3

en un array producto => cantidad...
Estoy intentando con dos foreach uno dentro de otro pero me estoy mareando y no logro dar con la solución.
Una idea general de como hacerlo?
Muchas gracias!!
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #2 (permalink)  
Antiguo 25/04/2014, 08:37
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Arrays - agrupar y sumar

Si lo haces con MySQL, puedes usar SUM y GROUP BY:

Código MySQL:
Ver original
  1. SELECT SUM(Pedidos.Cantidad) AS CantidadTotal FROM Pedidos GROUP BY Pedidos.Producto

Si lo quieres hacer con php, mientras recorres el array podrías hacer:
Código PHP:
while ( $tmp $sql->fetch() ) {
    if(
$array_final[$tmp["Producto"]]) $array_final[$tmp["Producto"]]+=$tmp['Cantidad'];
    else 
$array_final[$tmp["Producto"]] = $tmp['Cantidad'];

Y tendrías un array por producto / cantidad
__________________
>> Eleazan's Source
>> @Eleazan
  #3 (permalink)  
Antiguo 25/04/2014, 13:43
Avatar de armandoweb  
Fecha de Ingreso: enero-2003
Ubicación: San Cristobal, Santa Fe, Argentina
Mensajes: 544
Antigüedad: 21 años, 3 meses
Puntos: 7
Respuesta: Arrays - agrupar y sumar

Eleazan, entiendo tu punto.
El tema es que el campo productos tengo guardado un array producto|cantidad que está serializado, por lo tanto para utilizar estos datos utilizo primero unserialize().
Luego ya tengo un array par-valor para recorrer con un foreach.
Hasta el momento lo estoy tratando de hacer así:

Código PHP:
$groups = array();
foreach (
$ordersbyuser as $key => $value) { //$ordersbyuser trae la consulta de la base de datos
    
foreach (unserialize($value->products) as $item => $valor){
        if(
$valor != 0){
        
$key $item[0];
        if (!isset(
$groups[$key])) {
            
$groups[$key] = array(
            
'items' => array($item),
            
'count' => $valor,
            );
       } else {
            
$groups[$key]['items'][] = $item;
            
$groups[$key]['count'] += $valor;
       }
       }
    }

Este codigo me arroja lo siguiente:

Código PHP:
array(1) {
  [
"Q"]=>
  array(
2) {
    [
"items"]=>
    array(
3) {
      [
0]=>
      
string(12"Producto 1"
      
[1]=>
      
string(12"Producto 2"
      
[2]=>
      
string(12"Producto 3"
    
}
    [
"count"]=>
    
int(11)
  }

es decir, un array items con los todos los productos y un array count con la cantidad de todos los productos, no el total por producto, que es lo que necesito....
Alguna orientación en que debo modificar?
Gracias!
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #4 (permalink)  
Antiguo 25/04/2014, 14:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Arrays - agrupar y sumar

¿En qué DBMS tienes esa base? ¿Es un RDBMS o es un NoSQL?
Si es en un RDBMS como MySQL, Posgre o cosas así, a esta pregunta:
Cita:
Alguna orientación en que debo modificar?
Te debeo responder: Modificar la base de datos...
El diseño que describes es algo que transgrede tanto el modelo relacional de bases de datos, que prácticamente sirve como material pedagógico en la universidad, para lo que no se debe hacer.
En serio.
Nunca, jamás, en el modelo relacional, se crean atributos con diferentes dominios (producto y cantidad son domnios distintos). Eso desde el inicio.
Sólo me queda suponer que es un NoSQL, donde tienes recursos apra hacer ese tipo de cuentas...



¿QUé es?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 25/04/2014, 14:23
Avatar de armandoweb  
Fecha de Ingreso: enero-2003
Ubicación: San Cristobal, Santa Fe, Argentina
Mensajes: 544
Antigüedad: 21 años, 3 meses
Puntos: 7
Respuesta: Arrays - agrupar y sumar

gnzsoloyo, se que no esta bien hecho esto pero es una base de datos mysql que ya estaba hecha, el cliente necesita unos cambios y dentro de estos cambios necesita esto, agrupar los productos y obtener las cantidades de cada uno...
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #6 (permalink)  
Antiguo 25/04/2014, 14:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Arrays - agrupar y sumar

Pues en ese contexto, no se puede lograr sin hacer en PHP un cálculo iterativo.
Es una de las peores formas de manejar esa info.
¿No existe ninguna posibilidad de hacer de esa base algo respetable? Te ahorrarías muchísmo tiempo en las consultas.
Trata de convencerlo explicándole que lo que quiere es un parche, pero que no le solucionará el problema. En el futuro próximo tendrá mas problemas si los datos no estan normalizados.
No puedes hcer minería de datos con un modelo así.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 25/04/2014, 15:05
Avatar de armandoweb  
Fecha de Ingreso: enero-2003
Ubicación: San Cristobal, Santa Fe, Argentina
Mensajes: 544
Antigüedad: 21 años, 3 meses
Puntos: 7
Respuesta: Arrays - agrupar y sumar

gnzsoloyo solo quiero terminarle esta tarea y dejar ir a este cliente...espero que me entiendas...con los años vamos sabiendo que trabajo volver a hacer y cual no...

alguna idea de código para agrupar los valores del array y sumarlos?
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #8 (permalink)  
Antiguo 25/04/2014, 16:08
 
Fecha de Ingreso: abril-2010
Ubicación: Cancun
Mensajes: 88
Antigüedad: 14 años
Puntos: 2
Respuesta: Arrays - agrupar y sumar

Pues lo mismo en el foro sabemos que contestas, como contestar y a quien ayudar tu estas ganando dinero a cambio y nosotros que por ayudarte.... Algo sencillo lo que pides

ya estas mas de la mitad del camino con tu algoritmo
  #9 (permalink)  
Antiguo 25/04/2014, 16:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Arrays - agrupar y sumar

Por mi parte, ya te dije: En ese contexto, sólo te queda recorrer y sumar...


Pero, bueno, yo ni siquiera me tomaría el trabajo.

Espero que te lo paguen bien.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 26/04/2014, 05:14
Avatar de armandoweb  
Fecha de Ingreso: enero-2003
Ubicación: San Cristobal, Santa Fe, Argentina
Mensajes: 544
Antigüedad: 21 años, 3 meses
Puntos: 7
Respuesta: Arrays - agrupar y sumar

gnzsoloyo muchas gracias por tus palabras.
Saludos.
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]

Etiquetas: agrupar, arrays, registro, 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 00:31.