[英]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.