【问题标题】:Iterate multiple arrays in single foreach在单个 foreach 中迭代多个数组
【发布时间】:2014-08-09 12:42:32
【问题描述】:

我有一组这样的文本框:

<input type="text" name="tbxt[]" />
<input type="text" name="tbxt[]" />
<input type="text" name="tbxt[]" />

我正在使用

foreach ($_POST['tbxt'] as $tbxt) {
    //
}

但例如,如果我有:

<input type="text" name="tbxt[]" /><select name="selxt[]"></select>
<input type="text" name="tbxt[]" /><select name="selxt[]"></select>
<input type="text" name="tbxt[]" /><select name="selxt[]"></select>

我可以这样写吗:

foreach (($_POST['tbxt'] as $tbxt) && ($_POST['selxt'] as $selxt)) {
    //
}

这可能吗?

【问题讨论】:

  • 你可以单独循环它们并将它们组合成一个公共对象。
  • 如果每个人的数量总是相同的,你可以先array_combine然后foreach ($combined as $tbxt =&gt; $selxt)

标签: php html arrays foreach


【解决方案1】:

看起来像是 SPL Multiple iterators 的案例:

$mi = new MultipleIterator();
$mi->attachIterator(new ArrayIterator($_POST['tbxt']));
$mi->attachIterator(new ArrayIterator($_POST['selxt']));
foreach($mi as list($tbxt, $selxt)) {
    echo $tbxt, ' ', $selxt, PHP_EOL;
    ....
}

虽然这里使用list() 需要PHP >= 5.5.0

您可以在早期版本中通过为每个迭代器分配一个名称来模拟这一点,然后在您的循环中提取:

$mi = new MultipleIterator();
$mi->attachIterator(new ArrayIterator($_POST['tbxt']), 'tbxt');
$mi->attachIterator(new ArrayIterator($_POST['selxt']), 'selxt');
foreach($mi as $lists) {
    extract($lists);
    echo $tbxt, ' ', $selxt, PHP_EOL;
    ....
}

$mi = new MultipleIterator();
$mi->attachIterator(new ArrayIterator($_POST['tbxt']), 'tbxt');
$mi->attachIterator(new ArrayIterator($_POST['selxt']), 'selxt');
foreach($mi as $lists) {
    echo $lists['tbxt'], ' ', $lists['selxt'], PHP_EOL;
    ....
}

【讨论】:

  • 哇,这太神奇了,以前从未见过,我有一个问题。如果它们的尺寸不同会怎样?假设seltxt 只有 2
  • @Ghost,这就是您需要阅读 PHP 文档的地方,并查看可应用于多个迭代器以处理这种情况的标志...因为您可以应用不同的选项来说明如何多个迭代器应该在这种情况下运行(参见文档中的predefined constants)。您还可以控制键的绑定方式;但是当每个条目的数量相同时,它肯定更容易使用,并且您可以使用多个迭代器链接任意数量的数组,您不仅限于 2
【解决方案2】:

如果您愿意使用for 而不是foreach,您可以执行以下操作:

$tbxt = $_POST['tbxt'];
$selxt = $_POST['selxt']

for ($i=0; $i<sizeof($tbxt); $i++) {
    //access them using $tbxt[$i] and $selxt[$i]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2013-02-03
    相关资源
    最近更新 更多