views:

3095

answers:

7

Hi all, I have the following code:

        <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>

Let assume that I have several rows of the above code. How do I iterate and get the value for arrays $_POST['fullname'] and $_POST['job_title']?

+7  A: 

It's just an array:

foreach ($_POST['fullname'] as $name) {
    echo $name."\n";
}

If the problem is you want to iterate over the two arrays in parallel simply use one of them to get the indexes:

for ($i=0; $i < count($_POST['fullname']); $i++) {
    echo $_POST['fullname'][$i]."\n";
    echo $_POST['job_title'][$i]."\n";
}
Vinko Vrsalovic
Its here in the manual http://us.php.net/manual/en/faq.html.php#faq.html.arrays
OIS
A: 

Thank you for the replies.

If you look closely, the inputs are in a table row. I should have mentioned that this row can be duplicated on the fly; that's why I put a bracket for the inputs.

Example:

<?php $i=0; while($i < 5) { ?><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><?php $i++; } ?>

The problem here is I have 2 type of array inputs (fullname & job_title).

aeran
+3  A: 

I deleted this earlier since it was pretty close to Vinko's answer.

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

With original index not numerical from 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";
}

This is just for general info. With SPL DualIterator you can make something like:

$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();
}
OIS
And what would the benefit of the DualIterator be?
Vinko Vrsalovic
Its similar to every other Iterator in SPL, so for those who use Iterators its familiar. Its also similar for those used to Java I guess. But I think they should have at least make a MultiIterator instead of a limited DualIterator.
OIS
A: 

Both Vinko and OIS' answers are excellent (I upticked OIS'). But, if you are always printing 5 copies of the text fields, you can always just name each field specifically:

<?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; ?>" />
jmucchiello
this will produce the same result as not naming them.
OIS
Not exactly. The user could enter data in name[1] and job[3] and hit submit. The empty arrays will return both as name[0] and job[0]. Mine will not. (I don't know how helpful that makes mine though. :-) )
jmucchiello
+1  A: 

I think the problem you're trying to solve, is getting a pair of values from $_POST['fullname'][] and $_POST['jobtitle'][] which have same index.

for ($i = 0, $rowcount = count($_POST['fullname']); $i < $rowcount; $i++)
{
    $name = $_POST['fullname'][$i]; // get name
    $job  = $_POST['jobtitle'][$i]; // get jobtitle
}
Imran
This answer is the same as OIS' answer above.
jmucchiello
Yeah, I saw it after I posted my answer.
Imran
+1  A: 

If I understand you correctly, you have 2 arrays that you basically wish to iterate over in parallel.

Something like the below may work for you. Instead of $a1, and $a2 you would use $_POST['fullname'] and $_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);
}
Zoredache
A: 

Its pretty close to what I want to do. However I still need access to the original index number because let just say the row would be like this under some circumstances:

<tr>..
$_POST['fullname'][0] .... $_POST['job_title'][0]
$_POST['fullname'][2] .... $_POST['job_title'][2]
$_POST['fullname'][3] .... $_POST['job_title'][3]
..</tr>

By resetting the pointers obviously I would lose the value for $_POST['fullname'][3], am I right?

aeran
That would not happen with just fullname[], but if you specify the index and delete one with javascript then yes. I updated my answer for this.
OIS
I also think you should edit your question instead of putting updates as answers.
OIS
+1 to editing the question instead of adding answers. Mark clearly the edits/updates though...
Vinko Vrsalovic