Foros del Web » Programando para Internet » PHP »

Detener una iteracion de un foreach o una alternativa a goto

Estas en el tema de Detener una iteracion de un foreach o una alternativa a goto en el foro de PHP en Foros del Web. Hola colegas, me es dificil explicar las cosas, asi que espero logren entenderme: Veran el asunto es que recorro un arreglo de platillos con la ...
  #1 (permalink)  
Antiguo 07/01/2008, 17:19
Avatar de Sergestux  
Fecha de Ingreso: agosto-2007
Ubicación: Tapachula
Mensajes: 1.218
Antigüedad: 16 años, 8 meses
Puntos: 20
Detener una iteracion de un foreach o una alternativa a goto

Hola colegas, me es dificil explicar las cosas, asi que espero logren entenderme:
Veran el asunto es que recorro un arreglo de platillos con la instruccion foreach, pero como mi arreglo solo contiene un valor por cada platillos y yo necesito imprimir 1 o dos veces el mismo platillo, necesito saber si hay alguna manera de decirle al foreach que no siga en la siguiente iteracion o en su defecto usar una instruccion goto que me permita ejecutar la misma iteracion. Por ahora los solucione de una fea manera poniendo el mismo codigo dos veces, una funcion seria muy tediosa ya que hay varias variables implicadas en el asunto, necesitaria pasar muchas variables y regresarlas tambien.

Para mejor ejemplo ahi les va el codigo, espero puedan ayudarme en algo:

Código PHP:
        $Platillos['1']='cocacola';
        
$Platillos['8']='hot dog';

            foreach(
$Platillos as $PlatilloId)
            {
                
/*Ventas Platillos Normales*/
                
if ($PlatilloNormal[$PlatilloId]['Cant'])
                {
                    
$UniVendidas=$PlatilloNormal[$PlatilloId]['Cant'];
                    ...
                }
                
/*Mismo Codigo*/
                
$Cadena .= "<tr class='filarpt$tipo_linea'>";    //Imprimo la descripcion dle platillo
                
$Cadena .= "<td align='center'>$UniVendidas</td>\t";        //Imprimo la cantidad de los platillos (Unidades vendidas)
                
... Muchas lineas de codigo mas (Suma de totales y esas cosas)
                ...
                ...    

                
/*Venta de platillos compuestos*/
                
if ($PlatilloCompuesto[$PlatilloId]['Cant'])    //Si es un platillo compuesto
                
{
                    
$UniVendidas=$PlatilloCompuesto[$PlatilloId]['Cant'];
                    ...
                }
                
/*Mismo Codigo*/
                
$Cadena .= "<tr class='filarpt$tipo_linea'>";    //Imprimo la descripcion dle platillo
                
$Cadena .= "<td align='center'>$UniVendidas</td>\t";        //Imprimo la cantidad de los platillos (Unidades vendidas)
                
... Muchas lineas de codigo mas (Suma de totales y esas cosas)
                ...    
//Mismo Codigo
                
...
            } 
Quisiera hacer algo como esto, pero ya me entere de que no existe la sentencia goto en php

Código PHP:
            foreach($Platillos as $PlatilloId)
            {
                
/*Ventas Platillos Normales*/
                
if ($PlatilloNormal[$PlatilloId]['Cant'])
                {
                    
$UniVendidas=$PlatilloNormal[$PlatilloId]['Cant'];
                    ...
                }
                
/*Mismo Codigo*/
                
Aqui:
                
$Cadena .= "<tr class='filarpt$tipo_linea'>";    //Imprimo la descripcion dle platillo
                
$Cadena .= "<td align='center'>$UniVendidas</td>\t";        //Imprimo la cantidad de los platillos (Unidades vendidas)
                
... Muchas lineas de codigo mas (Suma de totales y esas cosas)
                ...
                ...    

                
/*Venta de platillos compuestos*/
                
if ($PlatilloCompuesto[$PlatilloId]['Cant'] and $Bandera==false)    //Si es un platillo compuesto
                
{
                    
$UniVendidas=$PlatilloCompuesto[$PlatilloId]['Cant'];
                    ...
                    
$Bandera=true;
                    
goto Aqui:
                    
//o Tratar de detener una iteracion
                
}
            } 
  #2 (permalink)  
Antiguo 07/01/2008, 18:35
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Detener una iteracion de un foreach o una alternativa a goto

Pues podrías usar each()

algo así como:

Código PHP:
reset($Platillos); // por las dudas, php.net/reset

$platilloId each($Platillos);

do {
// código
while ( $Bandera && ($PlatilloID each($Platillos) ) ) 
Entonces, si no querés que la matriz avance, simplemente ponés $bandera a falso. Como usás el Y por circuito corto, si $bandera es falso la parte del each no se ejecuta


Saludos.
  #3 (permalink)  
Antiguo 07/01/2008, 18:36
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Detener una iteracion de un foreach o una alternativa a goto

Una posible solucion sería meter el código que no quieres repetir en una función, así, para llamarlo, sólo llamas a la función.

Un saludo,
  #4 (permalink)  
Antiguo 08/01/2008, 06:22
Avatar de _cx
_cx
 
Fecha de Ingreso: diciembre-2007
Ubicación: Montevideo, Uruguay
Mensajes: 70
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Detener una iteracion de un foreach o una alternativa a goto

mirate esto:
Código:
http://www.php.net/break
Código:
http://www.php.net/continue
  #5 (permalink)  
Antiguo 08/01/2008, 14:22
Avatar de Sergestux  
Fecha de Ingreso: agosto-2007
Ubicación: Tapachula
Mensajes: 1.218
Antigüedad: 16 años, 8 meses
Puntos: 20
Re: Detener una iteracion de un foreach o una alternativa a goto

Gracias a todos por responder, tenia mis dudas sobre si me entenderian pero ya veo que si.
Tomare el metodo que menciona Alvlin aunque se me hace logicamente enredado, tambien ya habia checado las funciones de break y continue (en varias ocasiones las he empleado) y me sigue pareciendo enredado, pero esta bien para salir del paso... GRACIAS
  #6 (permalink)  
Antiguo 09/01/2008, 05:34
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Detener una iteracion de un foreach o una alternativa a goto

Si se te hace enredado, lo mejor es que preguntes por la parte que no comprendes del todo, así queda claro para la próxima


Saludos.
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 10:15.