2010-03-28 124 views
5

我有问题,在同一阵列上两次迭代:嵌套的foreach

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

上面的代码打印:

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

而且我希望看到的东西像这样(图像中组合标签不一样,但我认为这个想法很清楚):

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

在此先感谢

回答

9

我的第一个instict是不使用foreach循环。我相信PHP正在使用一些内部指针,因此两个foreach循环会影响彼此的位置。而是使用正常的循环。

+3

感谢理查德,我用一个正常的替换了第一个foreach,它工作。我不能相信PHP在这样一个简单的结构中有这么大的BUG ...... – Neuquino 2010-03-28 14:43:28

+2

这不是一个错误,它记录在php.net/foreach上:注意:除非数组被引用,否则foreach在副本上运行指定数组,而不是数组本身。 foreach对数组指针有一些副作用。不要在foreach期间或之后依赖数组指针而不重置它。 – 2010-03-28 14:48:07

+5

是否有记录,这是一个BUG。这种行为不直观,没有人会期望这段代码的结果。 PHP应该为每个foreach结构使用不同的指针。 – Neuquino 2010-03-28 15:04:55

2

根据你的代码,似乎你实际上并不想在outher循环中使用foreach循环。只要做一个从0到数组大小的常规循环。事情是这样的:

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

是的,这将是我的代码的一个解决方案。但我想知道我这是不工作... – Neuquino 2010-03-28 15:00:50

0

我相信泰德第二循环应该看起来像与否

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

否则你不使用从第一循环anyware $ commision1其

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

相关

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

我用它来迭代...它将从1到count($ comisiones)for循环相同... – Neuquino 2010-03-28 14:59:38

0

使用正常的,有两个指标的环,就像这样:

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

由于PHP的网站中明确提出:

“注:当foreach开始执行时,数组内部的指针会自动指向到数组的第一个元素“。 [来源:http://www.php.net/manual/en/control-structures.foreach.php]

因此,你的内部foreach循环每次都重置数组指针,这就是为什么你只出现一个可怕的混乱。 :)