简体   繁体   中英

Passing two variables into a 'foreach' loop

I need help regarding a foreach() loop. aCan I pass two variables into one foreach loop?

For example,

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

Here, $specs and $material are nothing but an array in which I am storing some specification and material name and want to print them one by one. I am getting the following error after running:

Parse error: syntax error, unexpected ',', expecting ')' on foreach line.

In the Beginning, was the For Loop:

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

You can not have two arrays in a foreach loop like that, but you can use array_combine to combine an array and later just print it out:

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

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

Output :

first 112
second 332

But if any of the names don't have material then you must have an empty/null value in it, otherwise there is no way that you can sure which material belongs to which name. So I think you should have an array like:

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

Now you can just

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

Just FYI: If you want to have multiple arrays in foreach , you can use list :

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

Though first you need to do this: $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;
    }

The output will be:

first
second
112
332

And still I don't think it will serve your exact purpose, because it goes through the first array and then the second array.

You can use the MultipleIterator of SPL. It's a bit verbose for this simple use case, but works well with all edge cases:

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

The default settings of the iterator are that it stops as soon as one of the arrays has no more elements and that you can access the current elements with a numeric key, in the order that the iterators have been attached ( $current[0] and $current[1] ).

Examples for the different settings can be found in the constructor documentation .

This is one of the ways to do this:

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

If you have ['foo', 'bar'] and [2 => 'mat1', 3 => 'mat2'] then this approach won't work but you can use array_values to discard keys first.

Another apprach would be (which is very close to what you wanted, in fact):

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

This will terminate when one of them ends and will work if they are not indexed the same. However, if they are supposed to be indexed the same then perhaps the solution above is better. Hard to say in general.

Do it using a for loop...

Check it below:

<?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];
    }
?>

OUTPUT

axbyczd

Simply use a for loop. And inside that loop, extract values of your array:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM