如何将两个foreach循环合并为一个?

9

这段内容是关于IT技术的,涉及到PHP语言。其中有两个foreach循环,一个是foreach($a as $b),另一个是foreach($c as $d => $e)。请问如何将它们合并成一个循环来读取数据?我尝试使用foreach (($a as $b) && ($c as $d => $e)),但是这种方法行不通。

4个回答

26

您可能对SPL的MultipleIterator感兴趣。

例如:

// ArrayIterator is just an example, could be any Iterator.
$a1 = new ArrayIterator(array(1, 2, 3, 4, 5, 6));
$a2 = new ArrayIterator(array(11, 12, 13, 14, 15, 16));

$it = new MultipleIterator;
$it->attachIterator($a1);
$it->attachIterator($a2);

foreach($it as $e) {
  echo $e[0], ' | ', $e[1], "\n";
}

打印

1 | 11
2 | 12
3 | 13
4 | 14
5 | 15
6 | 16

这是我今天看到的最有趣的代码。为此点赞。数组必须长度相等吗?还是你会在某个时刻停止迭代其中一个数组? - Mark Tomlin
3
这取决于您是否设置了MultipleIterator :: MIT_NEED_ANY或MultipleIterator :: MIT_NEED_ALL标志。使用MIT_NEED_ALL时,如果任何一个内部迭代器没有更多元素,则迭代器停止。使用MIT_NEED_ANY时,只要至少有一个内部迭代器还有另一个元素,迭代器就会继续,所有其他项都变为NULL。MIT_NEED_ALL是默认设置。 - VolkerK
感谢您介绍这个SPL功能!我也给你点赞! - hoball
刚刚看到这个 - 看起来是针对PHP 5.3.0+的。我正在使用5.2.17,那么有没有适用于该PHP版本的替代方法? - Zach Reed

11

1)第一种方法

<?php
$FirstArray = array('a', 'b', 'c', 'd');
$SecondArray = array('1', '2', '3', '4');

foreach(array_combine($FirstArray, $SecondArray) as $f => $n) {
    echo $f.$n;
    echo "<br/>";
}
?>

或者2)第二种方法

<?php
$FirstArray = array('a', 'b', 'c', 'd');
$SecondArray = array('1', '2', '3', '4');

for ($index = 0 ; $index < count($FirstArray); $index ++) {
  echo $FirstArray[$index] . $SecondArray[$index];
  echo "<br/>";
}
?>

3
我不理解你试图做什么。如果你想一个接一个地联系他们,只需使用两个循环:
foreach ($a as $b) { ... }
foreach ($c as $d => $e) { ... }

如果您想要从$a$c获取所有组合:
foreach ($a as $b) {
  foreach ($c as $d => $e) {
    // do stuff
  }
}

我想你可以这样做:
foreach (array_merge($a, $c) as $k => $v) {
  ...
}

但我不一定建议这样做。


0

我认为这将达到您想要的效果。它将在循环过程中同时等量地提升两个数组。如果您需要基于数组大小进行打破逻辑,并且$c$a的大小不同,则始终可以手动break

foreach($a as $b)
{
    list($d,$e) = each($c);
    //continue on with $b, $d and $e all set
}

each() 函数会在每次迭代时将数组指针向前移动 $c


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接