PHP虽然在里面

时间:2014-04-24 18:46:39

标签: php while-loop

假设我正在尝试合并两个列表中的项目,我希望得到这样的结果:

A7
A8
B7
B8

这是我的代码:

<?php

$list1_array = array('A', 'B');
$list2_array = array('7', '8');

while(list( , $item1) = each($list1_array)) {  

      while(list( , $item2) = each($list2_array)) {
      echo $item1.$item2."<br />";
      }
}

?>

我得到了这个结果:

A7
A8

我似乎在外面'虽然'没有进行第二次循环? 我做错了什么?

2 个答案:

答案 0 :(得分:3)

为什么不使用foreach?

foreach ($list1_array as $item1)
{
  foreach ($list2_array as $item2)
  {
    echo $item1.$item2."<br />";
  }
}

使用带有while的{​​{1}}循环使循环依赖于数组指针。一个数组有一个指针,告诉你哪个项目是&#39;当前&#39;一。您可以使用each之类的函数来获取数组中的当前项。 current也是这样一个功能。它返回当前项(或实际上是具有当前项的键和值的数组)。

这就是问题所在。当你在数组的末尾时,内部while循环停止。因此,对于外部数组(array1)的第一项,内部while循环(array2)运行正常。但第二次,指针仍然在数组的末尾,each立即返回false。

因此,解决方案可能是使用each函数重置pointed out by @summea来重置数组指针。或者您可以使用不受此现象影响的reset循环,因为它在启动时会重置数组指针本身。另外,我觉得它更具可读性,特别是由于奇怪的foreach结构。尽管如此,了解内部结构如何工作可能会很好,而list循环的工作级别低于while

答案 1 :(得分:3)

虽然使用稍微更常见的(可能更具可读性)方法可能更好(例如,通过使用foreach循环{{3 }},<)em回答你原来的问题:

问题很可能发生,因为您阵列的内部“光标” (或“as shown by GolezTrol”)不是pointer ...所以它永远不会回到原始数组的开头。

相反,如果你尝试这样的话会怎么样:

<?php    
$list1_array = array('A', 'B');
$list2_array = array('7', '8');

while(list(,$item1) = each($list1_array)) {   
    while(list(,$item2) = each($list2_array)) {
      echo $item1.$item2."<br />";
    }
    reset($list2_array);
}
?>