【问题标题】:Displaying HTML table from PHP array with two headers显示带有两个标题的 PHP 数组中的 HTML 表
【发布时间】:2019-12-07 12:01:12
【问题描述】:

我有一个包含运动结果的数组,如下所示:

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 表格中以特定方式显示数组数据,应该是这样的。顶部标题应包含“距离”键的所有唯一值,左侧标题应包含“名称”键的所有唯一值:

           |  60  |  100  |  200  |  400
===========================================
Alexnader  |  9   |  10   |   11  |  12
===========================================
Dmitriy    |  5   |   6   |   7   |   8
===========================================
Sergei     |  1   |   2   |   3   |   4

我怎样才能用最少的循环或使用 php 数组方法以最快的方式做到这一点?谢谢。

【问题讨论】:

  • 这是php数组?在此处发布数组而不是 print_r() 的输出
  • @DevsiOdedra 这是一个数组的 print_r() 输出。
  • 到目前为止,您自己有没有尝试过?
  • 也许有一些更好的方法来组织数组中的数据,这样你就可以随意打印它们了!

标签: php html arrays


【解决方案1】:

获取表格的唯一距离和名称。

$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";

使用我们的查找功能为每个名称逐行输出数据

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>

【讨论】:

    【解决方案2】:

    我们必须先重组数组

    $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
    

    【讨论】:

      猜你喜欢
      • 2014-08-27
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多