У меня такой код:
<tr>
<td width = "60%">
<dl>
<dt>Full Name</dt>
<dd>
<input name = "fullname[]" type = "text" class = "txt w90" id = "fullname[]" value = "<?php echo $value; ?>" />
</dd>
</dl>
</td>
<td width = "30%">
<dl>
<dt>Job Title</dt>
<dd>
<input name = "job_title[]" type = "text" class = "txt w90" id = "job_title[]" value = "<?php echo $value2; ?>" />
</dd>
</dl>
</td>
</tr>
Предположим, у меня есть несколько строк приведенного выше кода. Как выполнить итерацию и получить значение для массивов $_POST['fullname'] и $_POST['job_title']?






Это просто массив:
foreach ($_POST['fullname'] as $name) {
echo $name."\n";
}
Если проблема в том, что вы хотите перебрать два массива параллельно, просто используйте один из них для получения индексов:
for ($i=0; $i < count($_POST['fullname']); $i++) {
echo $_POST['fullname'][$i]."\n";
echo $_POST['job_title'][$i]."\n";
}
Я удалил это раньше, так как он был довольно близок к ответу Винко.
for ($i = 0, $t = count($_POST['fullname']); $i < $t; $i++) {
$fullname = $_POST['fullname'][$i];
$job_title = $_POST['job_title'][$i];
echo "$fullname $job_title \n";
}
С исходным индексом не числовым от 0 - N-1
$range = array_keys($_POST['fullname']);
foreach ($range as $key) {
$fullname = $_POST['fullname'][$key];
$job_title = $_POST['job_title'][$key];
echo "$fullname $job_title \n";
}
Это просто для общей информации. С SPL DualIterator вы можете сделать что-то вроде:
$dualIt = new DualIterator(new ArrayIterator($_POST['fullname']), new ArrayIterator($_POST['job_title']));
while($dualIt->valid()) {
list($fullname, $job_title) = $dualIt->current();
echo "$fullname $job_title \n";
$dualIt->next();
}
Он похож на любой другой итератор в SPL, поэтому для тех, кто использует итераторы, он знаком. Я думаю, он также похож на тех, кто привык к Java. Но я думаю, что им следовало бы хотя бы создать MultiIterator вместо ограниченного DualIterator.
Ответы как Vinko, так и OIS превосходны (я поднял OIS). Но, если вы всегда печатаете 5 копий текстовых полей, вы всегда можете просто дать каждому полю отдельное имя:
<?php $i=0; while($i < 5) { ?><tr>
...
<input name = "fullname[<?php echo $i; ?>]" type = "text" class = "txt w90" id = "fullname[<?php echo $i; ?>]" value = "<?php echo $value; ?>" />
это приведет к тому же результату, что и их отсутствие.
Не совсем. Пользователь может ввести данные в имя [1] и задание [3] и нажать «Отправить». Пустые массивы вернут как имя [0], так и задание [0]. Моя не будет. (Я не знаю, насколько это полезно для меня. :-))
Я думаю, что проблема, которую вы пытаетесь решить, заключается в получении пары значений из $ _POST ['fullname'] [] и $ _POST ['jobtitle'] [] с одинаковым индексом.
for ($i = 0, $rowcount = count($_POST['fullname']); $i < $rowcount; $i++)
{
$name = $_POST['fullname'][$i]; // get name
$job = $_POST['jobtitle'][$i]; // get jobtitle
}
Этот ответ совпадает с ответом OIS выше.
Да, я увидел это после того, как опубликовал свой ответ.
Если я вас правильно понял, у вас есть 2 массива, которые вы в основном хотите перебирать параллельно.
Что-то вроде приведенного ниже может сработать для вас. Вместо $a1 и $a2 вы должны использовать $_POST['fullname'] и $_POST['jobtitle'].
<?php
$a1=array('a','b','c','d','e','f');
$a2=array('1','2','3','4','5','6');
// reset array pointers
reset($a1); reset($a2);
while (TRUE)
{
// get current item
$item1=current($a1);
$item2=current($a2);
// break if we have reached the end of both arrays
if ($item1===FALSE and $item2===FALSE) break;
print $item1.' '. $item2.PHP_EOL;
// move to the next items
next($a1); next($a2);
}
И в чем преимущество DualIterator?