简体   繁体   中英

Loop but different table row

I am trouble to iterate array with different rows.

I have this type of array in PHP.

Array
(
    [1] => Array
        (
            [0] => Array
                (
                    [detail-1] => 1
                    [detail-2] => 2
                )

            [1] => Array
                (
                    [detail-3] => 3
                    [detail-4] => 4
                )

        )

    [2] => Array
        (
            .....
        )
)

Ant I want output as HTML like below :

<tr>
    <td>1</td>
</tr>
<tr>
    <td>detail-1</td>
    <td>detail-2</td>
</tr>
<tr>
    <td>detail-3</td>
    <td>detail-4</td>
</tr>
<tr>
    <td>2</td>
</tr>
...........

So, how to fix this logically ?

Thanks in advance.

You have multiple sub array so loop over every array

try following code:

$arr = Array
(
    1 => Array
        (
            0 => Array
                (
                    "detail-1" => 1,
                    "detail-2" => 2
                ),

            1 => Array
                (
                    "detail-3" => 3,
                    "detail-4" => 4
                ),

        ),

    2 => Array
        (
            0 => Array
                (
                    "detail-5" => 5,
                    "detail-6" => 6
                ),

            1 => Array
                (
                    "detail-7" => 7,
                    "detail-8" => 8
                ),
        )
);
echo "<table border=1>";
foreach ($arr as $key => $value) {
  echo "<tr><td>$key</td></tr>";
  if(is_array($value))
  {
      for($i = 0; $i<count($value);$i++)
      {
        if(is_array($value[$i]))
        {
          echo "<tr>";
          foreach ($value[$i] as $key1 => $value1) {
            echo "<td>$key1</td>";
          }
          echo "</tr>";
        }
      }
  }
}
echo "</table>";

Output will be :

<table border="1">
  <tbody>
    <tr>
      <td>1</td>
    </tr>
    <tr>
      <td>detail-1</td>
      <td>detail-2</td>
    </tr>
    <tr>
      <td>detail-3</td>
      <td>detail-4</td></tr>
    <tr>
      <td>2</td>
    </tr>
    <tr>
      <td>detail-5</td>
      <td>detail-6</td>
    </tr>
    <tr>
      <td>detail-7</td>
      <td>detail-8</td>
    </tr>
  </tbody>
</table>

Try it as following:

foreach($array as $key => $item) {

    echo '<tr><td colspan="2">' . $key. '</td></tr>';
    foreach($item as $val) {
            echo "<tr>";
            foreach($val as $k => $isu) echo "<td>" . $k  . "</td>";
            echo "</tr>";
    }


}
$array=array
(
    1 => array
        (
            0 => array
                (
                    'detail-1' => 1,
                    'detail-2' => 2
                ),

            1 => array
                (
                    'detail-3' => 3,
                    'detail-4' => 4
                )

        ),
    2 =>array
        (
            0 => array
                (
                    'detail-1' => 1,
                    'detail-2' => 2
                ),

            1 => array
                (
                    'detail-3' => 3,
                    'detail-4' => 4
                )

        )
);
$html="";
foreach($array as $k=>$v){
    $html .="<tr><td>".$k."</td></tr>";
    foreach($v as $i){
        $html.="<tr>";
        foreach($i as $key=>$value)$html.="<td>".$key."</td>";
        $html.="</tr>";
    }

}
echo $html;

You can try this. This is much cleaner and easy to understand.

CODE:

$table =array(
            '1' => array(
                '0' => array(
                    "detail-1" => 1,
                    "detail-2" => 2,
                ),
                '1' => array(
                    "detail-3" => 3,
                    "detail-4" => 4,
                )
            ),
            '2' => array(
                '0' => array(
                    "detail2-1" => 1,
                    "detail2-2" => 2,
                ),
                '1' => array(
                    "detail2-3" => 3,
                    "detail2-4" => 4,
                )
            )
        );

$output = '';
foreach($table as $first_tr_key => $first_tr){

    $output .= '<tr><td>' . $first_tr_key . '</td></tr>';

    foreach($first_tr as $second_tr_key => $second_tr){

        $output .= '<tr>';

        foreach($second_tr as $key => $val){
            $output .= '<td>' . $key . '</td>';
        }

        $output .= '</tr>';
    }
};

echo $output;

OUTPUT:

<tr>
    <td>1</td>
</tr>
<tr>
    <td>detail-1</td>
    <td>detail-2</td>
    </tr>
<tr>
  <td>detail-3</td>
  <td>detail-4</td>
</tr>
<tr>
  <td>2</td>
</tr>
<tr>
  <td>detail2-1</td>
  <td>detail2-2</td>
</tr>
<tr>
  <td>detail2-3</td>
  <td>detail2-4</td>
</tr>

You can use nested foreach Loop to loop through your array to get desired output

here is some trick.

your array..

$arr = Array(
 1 => Array(0 => Array('detail1' => 101, 'detail2' => 201), 1 => Array( 'detail3' => 301, 'detail4' => 401)),
2 => Array(0 => Array('detail1' => 102, 'detail2' => 202), 1 => Array( 'detail3' => 302, 'detail4' => 402))
);

And here sample code:

    echo '<table><thead><tr><th></th><th></th></td></thead><tbody>';

    foreach($arr as $key => $outerArr){
        echo '<tr><td>'.$key.'</td></tr>';
        foreach($outerArr as $inKey => $inArr){
            echo '<tr>';
            foreach($inArr as $innerArr)
                echo '<td>'.$innerArr.'</td>';

            echo '</tr>';
        }   
    }
    echo '</tbody></table>';

and output.

<table>
   <thead>
      <tr>
         <th></th>
         <th></th>
         </td>
   </thead>
   <tbody>
      <tr>
         <td>1</td>
      </tr>
      <tr>
         <td>101</td>
         <td>201</td>
      </tr>
      <tr>
         <td>301</td>
         <td>401</td>
      </tr>
      <tr>
         <td>2</td>
      </tr>
      <tr>
         <td>102</td>
         <td>202</td>
      </tr>
      <tr>
         <td>302</td>
         <td>402</td>
      </tr>
   </tbody>
</table>

Here is my go at it, 2 foreach loops,

<?php
$table =array(
    '1' => array(
        '0' => array(
            "detail-1" => 1,
            "detail-2" => 2,
        ),
        '1' => array(
            "detail-3" => 3,
            "detail-4" => 4,
        )
    ),
    '2' => array(
        '0' => array(
            "detail2-1" => 1,
            "detail2-2" => 2,
        ),
        '1' => array(
            "detail2-3" => 3,
            "detail2-4" => 4,
        )
    )
);


foreach($table as $key => $array){
    echo "<tr>
\t<td colspan=\"2\" >{$key}</td>
</tr>
";
    foreach($array as $k => $row){
        $one = key($row);
        next($row);
        $two = key($row);
       echo "<tr>
\t<td>{$one}</td>
\t<td>{$two}</td>
</tr>
";
    }
}

Outputs

<tr>
    <td colspan="2" >1</td>
</tr>
<tr>
    <td>detail-1</td>
    <td>detail-2</td>
</tr>
<tr>
    <td>detail-3</td>
    <td>detail-4</td>
</tr>
<tr>
    <td colspan="2" >2</td>
</tr>
<tr>
    <td>detail2-1</td>
    <td>detail2-2</td>
</tr>
<tr>
    <td>detail2-3</td>
    <td>detail2-4</td>
</tr>

You can skip one loop by using key() and next() You can try it here

http://sandbox.onlinephpfunctions.com/code/7231900a23f7f6afd8a57b979a27009a0fc7034b

Oh and don't forget the colspan="2" on the row with the single <td>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM