Foros del Web » Programando para Internet » PHP »

Bucle dentro de un Bucle

Estas en el tema de Bucle dentro de un Bucle en el foro de PHP en Foros del Web. Estimados amigos: Tengo una tabla pedidos con los siguientes campos: id | fecha | productos | total El campo productos es un array serializado, que ...
  #1 (permalink)  
Antiguo 13/04/2014, 13:41
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
Bucle dentro de un Bucle

Estimados amigos:

Tengo una tabla pedidos con los siguientes campos:
id | fecha | productos | total

El campo productos es un array serializado, que esta compuesto por idproducto=>cantidad. Dentro de este campo puede haber nproductos.

La carga del pedido la realizo mostrando cada producto, con su precio y un select para que indique la cantidad de ese producto, todo dentro de un bucle foreach.

Hasta aqui todo bien. El problema lo tengo cuando debo realizar un edit de un pedido y tengo que traer la cantidad de ese producto indicado cuando se cargó el pedido...se entiende?

Aquí el codigo que tengo hasta el momento...

http://pastebin.com/vvD9cnkj

Cualquier aclaracion que necesiten solo escriban...

Muchas gracias desde ya.
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #2 (permalink)  
Antiguo 13/04/2014, 14:04
 
Fecha de Ingreso: abril-2014
Ubicación: Canarias!
Mensajes: 150
Antigüedad: 10 años
Puntos: 10
Respuesta: Bucle dentro de un Bucle

Hola,¿que tal? Me gustó mucho el diseño de tu web, me encantan los diseños claros y simplistas y ese paralax que casi no se nota.

Perdon el off topic.

Este foro tiene una bbcode para bloques php, y como el código es corto se ajustaria mas ponerlo aqui mismo.


Antes que nada, debo avisar que si la base de datos es relacional (MySQL, MSSQL), meter un array en una columna no sigue las reglas de Normalizacion para bases de datos relaciones, te recomiendo cambiar la base de datos y hacerla bien, si no es muy tarde ya.

Si ya tienes la web hecha sobre la base de datos debemos partir sobre el punto, pero en serio, es mejor para ahorrarte futuros problemas corregir ese fallo, un campo solo deberia albegar 1 valor. Sé que parece ser muy fácil que para no tener muchas tablas meter arrays en campos, pero a la larga la base de datos se vuelve inmantenible.

El primer fallo que veo, si vas a enviar esos select por formulario y no por javascript, es que el select tiene un id pero no tiene nada, luego que no veo distincion del select para saber de que producto proviene el valor.

EDIT: Otra cosa, si pones un contador que se aumenta en el primer bucle, e indicas la posicion del contador en el array de valores, creo que te ahorras el doble bucle

Código PHP:
<?php
$ai 
0;
foreach (
$products as $product){
    <
div class="product">
           
            <
h5>'.$product->name.'</h5>
            <
p>'.$product->price.'</p>                             
           
            <
select id="quantity[]" class="select-product">
                    for (
$i=0$i 21$i++){ //debo mostrar un valor max de 20 en el select
                           
                            
if ($cantidad[$ai] == $i){
                                    <
option value=". $i ." selected="selected">. $i .</option>
                            }else{
                                    <
option value=". $i .">. $i .</option>
                            }
                                   
                    }
            </
select>
    </
div>
    
$ai++;
}
__________________
Pautas php:
No usar libreria mysql, usa mysqli; Separar siempre los controladores de la vista; Procedual es feo, ama los objetos

Última edición por Qazser; 13/04/2014 a las 14:14
  #3 (permalink)  
Antiguo 13/04/2014, 14: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: Bucle dentro de un Bucle

Hola Qazser, gracias por lo de la web...
Con respecto al diseño de la base ya estaba hecha cuando tome el proyecto.
Intentaré ver luego como poder almacenar un pedido de productos y cantidad en una tabla pedidos...
Entiendo lo que dices, veré si puedo modificar luego la tablar...
Cada producto tiene un hidden con el id de cada uno.
Lo que deseo es iterar los datos para mostrar la cantidad de productos correcta, la cantidad de 20 elementos en el select y marcar como "selected" la cantidad de ese producto que se había seleccionado en el momento de la carga del pedido...
Gracias por tu ayuda.
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #4 (permalink)  
Antiguo 13/04/2014, 14:18
 
Fecha de Ingreso: abril-2014
Ubicación: Canarias!
Mensajes: 150
Antigüedad: 10 años
Puntos: 10
Respuesta: Bucle dentro de un Bucle

Aiiii....Heredar proyectos mal comenzados, te compadezco en el corazón jaja.

Si la web asociada a la bd está terminado mejor no tocar tablas.

Dices que cada producto tiene un hidden...Creo que interpreté otra cosa. Yo pensaba que envias en UN mismo formulario todos los select como productos hay...igualmente, ponle name al select...Y ahora que estamos pregunto, en una misma página se muestran todos los productos, no? por que no haces 1 formulario y ya lo que recibes en el php va ser un solo array en orden "mas o menos"

Ah y mirate mi último mensaje editado, creo que te quité el doble bucle si esto te sirve.
__________________
Pautas php:
No usar libreria mysql, usa mysqli; Separar siempre los controladores de la vista; Procedual es feo, ama los objetos
  #5 (permalink)  
Antiguo 13/04/2014, 14:40
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: Bucle dentro de un Bucle

Cita:
Aiiii....Heredar proyectos mal comenzados, te compadezco en el corazón jaja.
Son solo un par de cambios...ya aprendí a seleccionar que trabajo hacer y cual no...jajajaja

Por ahi vamos, digo, con tu modificación de codigo...solo que ahora en todos los selects tiene seleccionada la cantidad del primer producto....

$cantidad es un array, intento utilizar in_array pero no me funciona....

Código PHP:
<?php

foreach ($products as $product){
    <
div class="product">
           
            <
h5>'.$product->name.'</h5>
            <
p>'.$product->price.'</p>                             
           
            <
select id="quantity[]" class="select-product">
                    for (
$i=0$i 21$i++){ //debo mostrar un valor max de 20 en el select
                           
                            
if (in_array($i$cantidad)) {
                                    <
option value=". $i ." selected="selected">. $i .</option>
                            }else{
                                    <
option value=". $i .">. $i .</option>
                            }
                                   
                    }
            </
select>
    </
div>
    
$ai++;
}
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #6 (permalink)  
Antiguo 13/04/2014, 14:44
 
Fecha de Ingreso: abril-2014
Ubicación: Canarias!
Mensajes: 150
Antigüedad: 10 años
Puntos: 10
Respuesta: Bucle dentro de un Bucle

Tercera vez que te lo digo, ponle un naaaame al select y así cada producto tendrá otro valor

Te lo dejo con un ejemplo

Código PHP:
 <?php
$ai
=0;
foreach (
$products as $product){
    <
div class="product">
           
            <
h5>'.$product->name.'</h5>
            <
p>'.$product->price.'</p>                             
           
            <
select id="quantity[]" name="'.$product->name.'"  class="select-product">
                    for (
$i=0$i 21$i++){ //debo mostrar un valor max de 20 en el select
                           
                            
if ($cantidad[$ai] == $i) {
                                    <
option value=". $i ." selected="selected">. $i .</option>
                            }else{
                                    <
option value=". $i .">. $i .</option>
                            }
                                   
                    }
            </
select>
    </
div>
    
$ai++;
}
Yo le he puesto el nombre del producto como nombre del select porque es la variable que veo, si tienes una variable a mano que tenga el id pues es mas "correcto y ordenado"

EDIT: Un momento, no te sirvió el truco del contador? cada producto deberia tener el valor por defecto que es

primer producto == Primer valor
segundo producto == segundo valor
asi succesivamente, por eso se suma 1 en el foreach cada vez
__________________
Pautas php:
No usar libreria mysql, usa mysqli; Separar siempre los controladores de la vista; Procedual es feo, ama los objetos

Última edición por Qazser; 13/04/2014 a las 14:53
  #7 (permalink)  
Antiguo 13/04/2014, 15:06
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: Bucle dentro de un Bucle

Ya le puse el name al select....

$products tiene 4 valores, porque tengo 4 productos cargados.

$cantidades tiene tambien 4 valores:
Código PHP:
array(4) { [0]=> string(1"4" [1]=> string(1"4" [2]=> string(1"3" [3]=> string(1"0" 
Ambos son arrays.

Código PHP:

<select id="quantity[]" name="'.$product->name.'"  class="select-product">
        for (
$i=0$i 21$i++){ //debo mostrar un valor max de 20 en el select
                           
             
if ($cantidad[$ai] == $i) {
                    <
option value=". $i ." selected="selected">. $i .</option>
             }else{
                    <
option value=". $i .">. $i .</option>
             }
                                   
        }
</
select
Este código debería funcionar pero no lo hace...ya estoy mareado...
El truco del contador me muestra siempre el mismo valor, el "4", que es el del primer producto. Los demas valores, el nombre del producto y el precio lo muestra correctamente para cada uno....
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]
  #8 (permalink)  
Antiguo 13/04/2014, 15:12
 
Fecha de Ingreso: abril-2014
Ubicación: Canarias!
Mensajes: 150
Antigüedad: 10 años
Puntos: 10
Respuesta: Bucle dentro de un Bucle

La variable $ai no suma al final entonces...me pregunto por que

Una cosa...me imagino que ese no es el código código..o sea esta el php y el html unido pero sin echo, sin separaciones....Me muestras el código real..o me dices como lo haces? xd
__________________
Pautas php:
No usar libreria mysql, usa mysqli; Separar siempre los controladores de la vista; Procedual es feo, ama los objetos
  #9 (permalink)  
Antiguo 13/04/2014, 15:19
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: Bucle dentro de un Bucle

Claro, eso pasa, el foreach me muestra correctamente los productos pero no itera de la misma forma las cantidades...

Estoy trabajando con Laravel (FW en php), desde el controlador traigo los arrays que necesito a la vista. Estoy intentando hacer con php puro, después lo paso a la forma en que Laravel trabaja, por eso no puedo pegarte toooodo el codigo aqui...

EDIT: No itera porque siempre estoy tomando el mismo indice:

$ai=0;
$cantidades[$ai] == $i

El bucle de producto foreach y el bucle for del select funcionan bien, pero eso no hace que $ai cambie...para eso debo agregar un valor a $ai, no?
__________________
www.awdesarrollos.com.ar - [twitter: @armandoweb] - [Skype: awdesarrollos"]

Última edición por armandoweb; 13/04/2014 a las 15:27
  #10 (permalink)  
Antiguo 13/04/2014, 15:33
 
Fecha de Ingreso: abril-2014
Ubicación: Canarias!
Mensajes: 150
Antigüedad: 10 años
Puntos: 10
Respuesta: Bucle dentro de un Bucle

ah oks...si si, lo conozco, me he leido su documentacion pero aun no he hecho nada con él. Suelo usar mi propio fw + Twig para la vista.

Volviendo al tema.

Yo solo queria optimizar el código, buscas donde falla $ai++; o vuelves a poner el doble bucle.


En la función que recibe los datos, seria reordenar el array para que vuelva estar como en la base de datos, usar el serialize() y sobreescribir el campo de la db con el nuevo.
__________________
Pautas php:
No usar libreria mysql, usa mysqli; Separar siempre los controladores de la vista; Procedual es feo, ama los objetos

Última edición por Qazser; 13/04/2014 a las 15:38

Etiquetas: bucle, fecha, select, 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 02:06.