Подтвердить что ты не робот

Передача двух переменных в цикл "foreach"

Мне нужна помощь в отношении цикла foreach(). aCan Я передаю две переменные в один цикл foreach?

Например,

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

Здесь $specs и $material - это не что иное, как массив, в котором я храню некоторое имя спецификации и материала и хочу их печатать один за другим. После запуска появляется следующая ошибка:

Ошибка анализа: синтаксическая ошибка, неожиданные ',', ожидающие ')' на строке foreach.

4b9b3361

Ответ 1

В начале было For Loop:

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

Ответ 2

У вас не может быть двух массивов в цикле foreach, но вы можете использовать array_combine для объединения массива, а затем просто распечатать его:

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

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

Выход:

first 112
second 332

Но если какое-либо из имен не имеет материала, то в нем должно быть пустое/нулевое значение, иначе вы не можете убедиться, какой материал принадлежит имени. Поэтому я думаю, что у вас должен быть массив вроде:

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

Просто FYI: если вы хотите иметь несколько массивов в 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

И все же я не думаю, что он будет служить вашей конкретной цели, потому что он проходит через первый массив, а затем второй массив.

Ответ 3

Вы можете использовать MultipleIterator SPL. Это немного подробный для этого простого случая использования, но хорошо работает со всеми случаями краев:

$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]).

Примеры для разных настроек можно найти в документации конструктора.

Ответ 4

Это один из способов сделать это:

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

Если у вас есть ['foo', 'bar'] и [2 => 'mat1', 3 => '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];
    }
?>

OUTPUT

axbyczd

Ответ 6

Просто используйте цикл for. И внутри этого цикла извлеките значения вашего массива:

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