簡體   English   中英

通過PHP將多維數組轉換為HTML表

[英]Transforming multidimensional array into HTML table via PHP

假設我有一個像這樣的數組:

array (
      0 =>
      array (
        'trip' => '1',
        'times' =>
        array (
          0 =>
          array (
            'order' => '1',
            'stop name' => 'Name 1',
            'stop time' => '7:03 am',
          ),
          1 =>
          array (
            'order' => '2',
            'stop name' => 'Name 2',
            'stop time' => '8:03 am',
          ),
          2 =>
          array (
            'order' => '3',
            'stop name' => 'Name 3',
            'stop time' => '9:03 am',
          ),
        ),
      ),
      1 =>
      array (
        'trip' => '2',
        'times' =>
        array (
          0 =>
          array (
            'order' => '1',
            'stop name' => 'Name 1',
            'stop time' => '10:03 am',
          ),
          1 =>
          array (
            'order' => '2',
            'stop name' => 'Name 3',
            'stop time' => '11:03 am',
          ),
        ),
      ),
      0 =>
      array (
        'trip' => '3',
        'times' =>
        array (
          0 =>
          array (
            'order' => '1',
            'stop name' => 'Name 1',
            'stop time' => '1:03 pm',
          ),
          1 =>
          array (
            'order' => '2',
            'stop name' => 'Name 2',
            'stop time' => '2:03 pm',
          ),
          2 =>
          array (
            'order' => '3',
            'stop name' => 'Name 3',
            'stop time' => '3:03 pm',
          ),
        ),
      ),
    )

但是我想通過PHP將這個數組轉換成一個看起來像這樣的表:

Name 1    | Name 2   | Name 3
------------------------------
7:03am    | 8:03am   | 9:03am
------------------------------
10:03am   |          | 11:03am
------------------------------
1:03pm    | 2:03pm   | 3:03pm

基本上,基於嵌套數組的數據可能存在間隙。 我已經可以像沒有間隙一樣構造一個表,但這會產生問題,並且我基於數據庫使用的數據不允許插入間隙,因此我需要知道是否有一個簡單的方法。用php和array命令構建一個像這樣的表,如果有一個值,可以記住並填充行名,如果沒有,則將其傳遞出去。

由於您可能會有隨機的間隔(帶有/不帶有某些名稱的行程),因此您需要首先找出所有唯一名稱,並在每次行程中將其填入空白,而不會出現。

數據

$a = array (
  0 =>
  array (
    'trip' => '1',
    'times' =>
    array (
      0 =>
      array (
        'order' => '1',
        'stop name' => 'Name 1',
        'stop time' => '7:03 am',
      ),
      1 =>
      array (
        'order' => '2',
        'stop name' => 'Name 2',
        'stop time' => '8:03 am',
      ),
      2 =>
      array (
        'order' => '3',
        'stop name' => 'Name 3',
        'stop time' => '9:03 am',
      ),
    ),
  ),
  1 =>
  array (
    'trip' => '2',
    'times' =>
    array (
      0 =>
      array (
        'order' => '1',
        'stop name' => 'Name 1',
        'stop time' => '10:03 am',
      ),
      1 =>
      array (
        'order' => '2',
        'stop name' => 'Name 3',
        'stop time' => '11:03 am',
      ),
    ),
  ),
  2 =>
  array (
    'trip' => '3',
    'times' =>
    array (
      0 =>
      array (
        'order' => '1',
        'stop name' => 'Name 1',
        'stop time' => '1:03 pm',
      ),
      1 =>
      array (
        'order' => '2',
        'stop name' => 'Name 2',
        'stop time' => '2:03 pm',
      ),
      2 => // Fixed this to 2 instead of 0 from your example
      array (
        'order' => '3',
        'stop name' => 'Name 3',
        'stop time' => '3:03 pm',
      ),
    ),
  ),
);

// Get a listing of all unique names available in this multi-dimensional array
// We need this to figure out how many gaps there may be in the data per trip
$unique_names = array();
foreach( $a as $v )
{
    foreach( $v[ 'times' ] as $v2 )
    {
        $unique_names[ $v2[ 'stop name' ] ] = $v2[ 'stop name' ];
    }
}

// Create a listing of trips and contain all available names within it even if that name did not have an entry
$trips = array();
foreach( $a as $v )
{
    // Per trip hold the stops in the same order as the $unique_names which were encountered
    $trips[ $v[ 'trip' ] ] = array();

    // Per name add a trip stop
    foreach( $unique_names as $name )
    {
        $in_trip = false;

        // Loop the available stops and check if this name is a stop
        foreach( $v[ 'times' ] as $v3 )
        {
            if( $v3[ 'stop name' ] === $name )
            {
                $trips[ $v[ 'trip' ] ][] = $v3[ 'stop time' ];
                $in_trip = true;
                break;
            }
        }

        // This name was not a stop so it will get an empty entry
        if( !$in_trip )
        {
            $trips[ $v[ 'trip' ] ][] = '';
        }
    }
}


// Show the names
echo '<table><tr>';
foreach( $unique_names as $name )
{
    echo '<td>'.$name.'</td>';
}
echo '</tr>';

// Loop the trips and output their stop times
// The stop times should be in the same order as $unique_names
foreach( $trips as $trip )
{
    echo '<tr>';
    foreach( $trip as $time )
    {
        echo '<td>'.$time.'</td>';
    }
    echo '</tr>';
}
echo '</table>';

產量

Name 1    Name 2   Name 3
7:03 am   8:03 am  9:03 am
10:03 am           11:03 am
1:03 pm   2:03 pm  3:03 pm

在此處輸入圖片說明

但是,正如MonkeyZeus指出的那樣,這是另一種解決方案。 數組中的第一個鍵和最后兩個鍵均為0。因此使用修改后的數組。

$array = array (
          0 =>
          array (
            'trip' => '1',
            'times' =>
            array (
              0 =>
              array (
                'order' => '1',
                'stop name' => 'Name 1',
                'stop time' => '7:03 am',
              ),
              1 =>
              array (
                'order' => '2',
                'stop name' => 'Name 2',
                'stop time' => '8:03 am',
              ),
              2 =>
              array (
                'order' => '3',
                'stop name' => 'Name 3',
                'stop time' => '9:03 am',
              ),
            ),
          ),
          1 =>
          array (
            'trip' => '2',
            'times' =>
            array (
              0 =>
              array (
                'order' => '1',
                'stop name' => 'Name 1',
                'stop time' => '10:03 am',
              ),
              2 =>
              array (
                'order' => '2',
                'stop name' => 'Name 3',
                'stop time' => '11:03 am',
              ),
            ),
          ),
          2 =>
          array (
            'trip' => '3',
            'times' =>
            array (
              0 =>
              array (
                'order' => '1',
                'stop name' => 'Name 1',
                'stop time' => '1:03 pm',
              ),
              1 =>
              array (
                'order' => '2',
                'stop name' => 'Name 2',
                'stop time' => '2:03 pm',
              ),
              2 =>
              array (
                'order' => '3',
                'stop name' => 'Name 3',
                'stop time' => '3:03 pm',
              ),
            ),
          ),
        );

foreach ($array as $trow) {
            ?>
        <tr>
            <?php

            $count = 0;

            for ($i=0; $i <= count($trow['times']) ; $i++) { 
                if ($count == $i) {
                    ?>
                    <td><?= $trow['times'][$count]['stop time']; ?></td>
                    <?php
                } else {
                    ?>
                    <td></td>
                    <?php
                }
                $count++;
            }


            ?>
        </tr>
            <?php
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM