繁体   English   中英

显示带有两个标题的 PHP 数组中的 HTML 表

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

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