假设我正在尝试合并两个列表中的项目,我希望得到这样的结果:
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
我似乎在外面'虽然'没有进行第二次循环? 我做错了什么?
答案 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);
}
?>