[英]Displaying HTML table from PHP array with two headers
我有一个包含运动结果的数组,如下所示:
Array
(
[0] => Array
(
[name] => Alexander
[distance] => 60
[value] => 9
)
[1] => Array
(
[name] => Alexander
[distance] => 100
[value] => 10
)
[2] => Array
(
[name] => Alexander
[distance] => 200
[value] => 11
)
[3] => Array
(
[name] => Alexander
[distance] => 400
[value] => 12
)
[4] => Array
(
[name] => Dmitriy
[distance] => 60
[value] => 5
)
[5] => Array
(
[name] => Dmitriy
[distance] => 100
[value] => 6
)
[6] => Array
(
[name] => Dmitriy
[distance] => 200
[value] => 7
)
[7] => Array
(
[name] => Dmitriy
[distance] => 400
[value] => 8
)
[8] => Array
(
[name] => Sergei
[distance] => 60
[value] => 1
)
[9] => Array
(
[name] => Sergei
[distance] => 100
[value] => 2
)
[10] => Array
(
[name] => Sergei
[distance] => 200
[value] => 3
)
[11] => Array
(
[name] => Sergei
[distance] => 400
[value] => 4
)
)
我需要在 html 表中以特定方式显示数组数据,应该是这样的。 顶部标题应包含来自“distance”键的所有唯一值,左侧标题应包含来自“name”键的所有唯一值:
| 60 | 100 | 200 | 400
===========================================
Alexnader | 9 | 10 | 11 | 12
===========================================
Dmitriy | 5 | 6 | 7 | 8
===========================================
Sergei | 1 | 2 | 3 | 4
我怎样才能用最少的循环或使用 php 数组方法以最快的方式做到这一点? 谢谢你。
获取表格的唯一距离和名称。
$names = array_unique(array_map(fn($a) => $a['name'], $data));
$dists = array_unique(array_map(fn($a) => $a['distance'], $data));
制作一个函数来按名称和距离查找表值。
function findValue($dist, $name, $data): string {
foreach($data as $d) {
if($d['name'] != $name || $d['distance'] != $dist ) continue;
return (string) $d['value'];
}
return '';
}
现在输出以头部和距离开头的表格
echo "<table>\n";
echo "<tr><th></th>", implode('', array_map(fn($col) => "<th>$col</th>", $dists)), "</tr>\n";
使用我们的 find 函数逐行输出每个名称的数据
foreach($names as $name) {
$row = [];
foreach($dists as $dist) {
$row[] = '<td>' . findValue($dist, $name, $data) . '</td>';
}
$rowText = join('', $row);
echo "<tr><td>$name</td>$rowText</tr>\n";
}
最后关上桌子。
echo "</table>\n";
结果是
<table>
<tr><th></th><th>60</th><th>100</th><th>200</th><th>400</th></tr>
<tr><td>Alexander</td><td>9</td><td>10</td><td>11</td><td>12</td></tr>
<tr><td>Dmitriy</td><td>5</td><td>6</td><td>7</td><td>8</td></tr>
<tr><td>Sergei</td><td>1</td><td>2</td><td>3</td><td>4</td></tr>
</table>
我们必须先重构数组
$array = Array
(
"0" => Array
(
"name" => "Alexander",
"distance" => 60,
"value" => 9
),
"1" => Array
(
"name" => "Alexander",
"distance" => 100,
"value" => 10
),
"2" => Array
(
"name" => "Alexander",
"distance" => 200,
"value" => 11
),
"3" => Array
(
"name" => "Alexander",
"distance" => 400,
"value" => 12
),
"4" => Array
(
"name" => "Dmitriy",
"distance" => 60,
"value" => 5
),
"5" => Array
(
"name" => "Dmitriy",
"distance" => 100,
"value" => 6
),
"6" => Array
(
"name" => "Dmitriy",
"distance" => 200,
"value" => 7
),
"7" => Array
(
"name" => "Dmitriy",
"distance" => 400,
"value" => 8
),
"8" => Array
(
"name" => "Sergei",
"distance" => 60,
"value" => 1
),
"9" => Array
(
"name" => "Sergei",
"distance" => 100,
"value" => 2
),
"10" => Array
(
"name" => "Sergei",
"distance" => 200,
"value" => 3
),
"11" => Array
(
"name" => "Sergei",
"distance" => 400,
"value" => 4
)
);
$table_heading = array_unique(array_column($array, "distance"));
$restructured_array = [];
foreach($array as $row){
if(!isset($restructured_array[$row["name"]])){
$restructured_array[$row["name"]] = [];
}
$restructured_array[$row["name"]][$row["distance"]] = $row["value"];
}
现在可以循环数组来打印表格。
echo "<table><thead><tr>";
echo "<th></th>";
foreach($table_heading as $heading){
echo "<th>".$heading."</th>";
}
echo "</tr></thead>";
echo "<tbody>";
foreach ($restructured_array as $key=>$rows){
echo "<tr><th>".$key."</th>";
foreach ($rows as $k=>$row){
echo "<td>".$row."</td>";
}
}
echo "</tbody></table>";
输出将是
60 100 200 400
Alexander 9 10 11 12
Dmitriy 5 6 7 8
Sergei 1 2 3 4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.