Ответ 1
В начале было For Loop:
$n = sizeof($name);
for ($i=0; i < $n; $i++) {
echo $name[$i];
echo $mat[$i];
}
Мне нужна помощь в отношении цикла foreach()
. aCan Я передаю две переменные в один цикл foreach
?
Например,
foreach($specs as $name, $material as $mat)
{
echo $name;
echo $mat;
}
Здесь $specs
и $material
- это не что иное, как массив, в котором я храню некоторое имя спецификации и материала и хочу их печатать один за другим. После запуска появляется следующая ошибка:
Ошибка анализа: синтаксическая ошибка, неожиданные ',', ожидающие ')' на строке foreach.
В начале было For Loop:
$n = sizeof($name);
for ($i=0; i < $n; $i++) {
echo $name[$i];
echo $mat[$i];
}
У вас не может быть двух массивов в цикле 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
И все же я не думаю, что он будет служить вашей конкретной цели, потому что он проходит через первый массив, а затем второй массив.
Вы можете использовать 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]
).
Примеры для разных настроек можно найти в документации конструктора.
Это один из способов сделать это:
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))) {
}
Это прекратится, когда один из них закончится и будет работать, если они не индексируются одинаково. Однако, если они должны быть проиндексированы одинаково, то, возможно, решение выше лучше. Трудно сказать вообще.
Сделайте это с помощью цикла 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
Просто используйте цикл for
. И внутри этого цикла извлеките значения вашего массива:
For (I=0 to 100) {
Echo array1[i];
Echo array2[i]
}