2008-12-20 5 views
4

У меня есть следующий код:

 <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']?

ответ

10

Это просто массив:

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"; 
} 
+0

Его здесь в руководстве http://us.php.net/manual/en/faq.html.php#faq.html.arrays – OIS

3

Я удалил эту раньше, так как он был близок к ответу Винько.

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(); 
} 
+0

И что польза от DualIterator быть? –

+0

Схож с любым другим Итератором в SPL, поэтому для тех, кто использует Итераторы, его знакомый. Его также похоже на те, которые используются для Java, я думаю. Но я думаю, что они должны хотя бы сделать MultiIterator вместо ограниченного DualIterator. – OIS

0

Оба Винко и OIS 'ответы отлично (я upticked 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; ?>" /> 
+0

, это приведет к такому же результату, что и не названию. – OIS

+0

Не совсем. Пользователь может ввести данные в имя [1] и задание [3] и нажать submit. Пустые массивы возвратятся как в качестве имени [0], так и в задании [0]. Мой не будет. (Я не знаю, как полезно это делает мой. :-)) – jmucchiello

1

Я думаю, что проблема, которую вы пытаетесь решить, получает пару значений из $ _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 
} 
+0

Этот ответ такой же, как ответ OIS выше. – jmucchiello

+0

Да, я видел это после того, как я отправил свой ответ. – Imran

1

Если вы правильно поняли, у вас есть 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); 
} 
Смежные вопросы