2010-03-28 18 views
5

estoy teniendo problemas para recorrer dos veces en la misma matriz:foreach anidados en el problema de PHP

<? $indice=0 ?> 
<?php foreach ($comisiones as $comision1):?> 
    <tr> 
    <td><?php echo ++$indice ?></td> 
    <td><?php echo tag('select',array('name'=>'comision_'.$indice),true)?> 
      <?php foreach ($comisiones as $comision2):?> 
      <option value="<?php echo $comision2->getId()?>"> 
       <?php echo $comision2->getNombre()." - ".$comision2->getDescripcion()?> 
      </option> 
      <?php endforeach?> 
     </select> 
    </td> 
    </tr> 
<?php endforeach?> 

Las impresiones de código anterior:

code result http://img440.imageshack.us/img440/7732/res.png

Y estoy esperando ver algo así (las etiquetas de los combos en las imágenes no son las mismas, pero creo que la idea es clara):

expected results http://img229.imageshack.us/img229/7969/esperado.png

Gracias de antemano

Respuesta

9

Mi primer instinto es no usan foreach bucles. Creo que PHP está utilizando algunos punteros internos por lo que los dos bucles foreach afectan la posición de cada uno. En su lugar, use un ciclo for normal.

+3

Gracias Richard, reemplacé el primer foreach con un normal y funcionó. No puedo creer que PHP tenga un ERROR ENORME en una estructura tan simple ... – Neuquino

+2

No es un error, está documentado como encontrado en php.net/foreach: Nota: A menos que se haga referencia a la matriz, foreach opera en una copia de la matriz especificada y no la matriz en sí. foreach tiene algunos efectos secundarios en el puntero del array. No confíe en el puntero de matriz durante o después del foreach sin restablecerlo. –

+5

si está documentado, es un ERROR. Ese comportamiento no es intuitivo, nadie esperaría ese resultado de esa pieza de código. PHP debe usar diferentes punteros para cada estructura foreach. – Neuquino

2

Según su código, parece que en realidad no desea un bucle foreach en el bucle outher. Simplemente haz un ciclo regular de 0 al tamaño de la matriz. Algo como esto:

for ($i = 0; $i < count($comisiones); ++$i) { 
    // Do what you want 
} 
+0

sí, esa sería una solución para mi código.Pero quería saber que no estaba funcionando ... – Neuquino

0

I belive THET el segundo bucle debería parecerse o sus relacionadas a

<?php foreach ($comision1 as $comision2): ?> 

no

<?php foreach ($comisiones as $comision2): ?> 

lo contrario no se está utilizando $ commision1 de primera anyware de bucle

<?php foreach ($comisiones as $comision1): ?> 
+0

Lo estoy usando para iterar ... sería lo mismo que un ciclo para de 1 a contar ($ comisiones) ... – Neuquino

0

Uso normal para bucles con dos índices, así:

$len = count($comisiones); 
for($i = 0; $i < $len; ++$i) 
    for($j = 0; $j < $len; ++$j) 

Como se indica claramente en PHP página web:

"Nota: Cuando foreach comienza su primera ejecución, el puntero interno se restablece automáticamente a la primer elemento de la matriz ". [fuente: http://www.php.net/manual/en/control-structures.foreach.php]

Por lo tanto, su bucle foreach interno se restablece cada vez que el puntero del conjunto, por eso está saliendo un desastre terrible. :)