【问题标题】:Passing two variables into a 'foreach' loop将两个变量传递给“foreach”循环
【发布时间】:2016-01-01 17:04:28
【问题描述】:

我需要有关 foreach() 循环的帮助。 a我可以将两个变量传递到一个foreach 循环中吗?

例如,

foreach($specs as $name, $material as $mat)
{
    echo $name;
    echo $mat;
}

这里,$specs$material 只不过是一个数组,我在其中存储了一些规格和材料名称,并希望将它们一个一个打印出来。运行后出现以下错误:

解析错误:语法错误,意外的 ',',在 foreach 行上需要 ')'。

【问题讨论】:

  • 使用 for 循环
  • 您没有指定它应该如何工作,$specs 和 $material 是否具有相同的长度?如果不是,那是什么?
  • 你到底想做什么?压缩数组,还是组合它们?

标签: php arrays foreach


【解决方案1】:

一开始是 For 循环:

$n = sizeof($name);
for ($i=0; i < $n; $i++) {
   echo $name[$i];
   echo $mat[$i];
}

【讨论】:

  • 这是(我认为)操作要求的方法,但是,应注意检查 $name 和 $mat 是否具有相同数量的元素。没有人喜欢 IndexOutOfBounds 异常。我不熟悉 php 中的确切语法(几年没用过),但我可以建议将其添加到您的代码中吗?
  • 我需要更改至少 5 个其他字符才能进行编辑 i -> $i :(
【解决方案2】:

你不能像这样在foreach 循环中有两个数组,但你可以使用array_combine 组合一个数组,然后打印出来:

$arraye = array_combine($name, $material);

foreach ($arraye as $k=> $a) {
     echo $k. ' '. $a ;
}

Output:

first 112
second 332

但是,如果任何名称没有材料,那么您必须在其中包含一个空/null 值,否则您无法确定哪个材料属于哪个名称。所以我认为你应该有一个像这样的数组:

$name = array('amy','john','morris','rahul');
$material = array('1w','4fr',null,'ff');

现在你可以

if (count($name) == count($material)) {
    for ($i=0; $i < $count($name); $i++) {
        echo $name[$i];
        echo $material[$i];
 }

仅供参考:如果您想在foreach 中有多个数组,可以使用list

foreach ($array as list($arr1, $arr2)) {...}

虽然首先你需要这样做:$array = array($specs,$material)

<?php
    $abc = array('first','second');
    $add = array('112','332');
    $array = array($abc,$add);

    foreach ($array as list($arr1, $arr2)) {
         echo $arr1;
         echo $arr2;
    }

输出将是:

first
second
112
332

我仍然认为它不能满足您的确切目的,因为它通过第一个数组,然后是第二个数组。

【讨论】:

  • 我应该在 foreach 循环中传递什么参数和材料?
  • @ManishMishra 检查this
  • 是否提到两个数组的计数相同??
  • 不,这不是@RohitKumar
  • "array_combine:两个数组必须有相同数量的元素!" ,所以会出问题
【解决方案3】:

您可以使用 SPL 的MultipleIterator。这个简单的用例有点冗长,但适用于所有边缘情况:

$iterator = new MultipleIterator();
$iterator->attachIterator(new ArrayIterator($specs));
$iterator->attachIterator(new ArrayIterator($material));
foreach ($iterator as $current) {
    $name = $current[0];
    $mat  = $current[1];
}

迭代器的默认设置是,一旦其中一个数组没有更多元素,它就会停止,并且您可以使用数字键访问当前元素,按照迭代器附加的顺序($current[0]$current[1])。

可以在constructor documentation 中找到不同设置的示例。

【讨论】:

  • @chx 顺便说一句,我真的看不出你和他的答案有什么区别..我知道两者都使用不同的方法,但后端工作是完全相同的......当然这个答案描述了很好的方法但是我还是喜欢你的方式
  • 因为它可以通过构造函数标志处理所有情况。
【解决方案4】:

这是执行此操作的方法之一:

foreach ($specs as $k => $name) {
  assert(isset($material[$k]));
  $mat = $material[$k];
}

如果您有['foo', 'bar'][2 =&gt; 'mat1', 3 =&gt; 'mat2'],则此方法不起作用,但您可以先使用array_values 丢弃密钥。

另一种方法是(实际上非​​常接近您想要的):

while ((list($name) = each($specs)) && (list($mat) = each($material))) {
}

这将在其中一个结束时终止,如果它们的索引不同,它将起作用。但是,如果它们应该被索引相同,那么上面的解决方案可能会更好。一般很难说。

【讨论】:

【解决方案5】:

使用for 循环...

在下面检查:

<?php
    $specs = array('a', 'b', 'c', 'd');
    $material = array('x', 'y', 'z');
    $count = count($specs) > count($material) ? count($specs) : count($material);
    for ($i=0;$i<$count;$i++ )
    {
        if (isset($specs[$i]))
            echo $specs[$i];
        if (isset($material[$i]))
            echo $material[$i];
    }
?>

输出

axbyczd

【讨论】:

  • 虽然这行得通,但很难知道有些材料不存在哪些材料适用于哪个用户
  • 如果这是一个要求,那么两个数组都应该捆绑在一起......就像你的回答@NullPoiиteя
【解决方案6】:

只需使用for 循环。在该循环中,提取数组的值:

For (I=0 to 100) {
    Echo array1[i];
    Echo array2[i]
}

【讨论】:

  • 它会编译吗(例如“For”)? PHP 不区分大小写吗?
  • 是的,但我的手机不是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
相关资源
最近更新 更多