PHP sorun iç içe foreach

4 Cevap php

Ben aynı dizide iki kez yineleme sorunları yaşıyorum:

<? $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?>  

Yukarıdaki kod yazdırır:

code result

Ve ben böyle bir şey (görüntülerde tarak etiketleri aynı değil, ama fikir açık olduğunu düşünüyorum) görmek için bekliyorum:

expected results

Şimdiden teşekkürler

4 Cevap

Benim ilk İçgüdü foreach döngüler kullanmak kalmamasıdır. Ben iki foreach döngüler birbirinin pozisyonunu etkileyen böylece PHP bazı iç işaretçileri kullanarak olduğuna inanıyoruz. Bunun yerine döngü için normal kullanın.

Aslında daha dış döngü içinde bir foreach döngüsü istemiyorum gibi koduna dayalı görünüyor. Sadece dizinin büyüklüğü 0 ila döngü için düzenli yapmak. Böyle bir şey:

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

Ben ikinci bir döngü thet inanıyoruz gerektiği gibi görünüyor ya da ilişkili

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

değil

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

aksi takdirde ilk döngü ANYWARE dan $ commision1 kullanarak değil

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

Bunun gibi, iki indeksleri ile döngüler normal kullanın:

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

PHP web sitesinde açıkça belirtildiği gibi:

"Not: When foreach first starts executing, the internal array pointer is automatically reset dizinin ilk elemanına." [Kaynak: http://www.php.net/manual/en/control-structures.foreach.php]

İçinizdeki foreach döngü her seferinde dizi işaretçisi sıfırlar O halde sadece korkunç bir karışıklık alıyorsanız, neden budur. :)