在HTML表格中显示嵌套数组

时间:2015-05-02 22:18:31

标签: php html arrays nested html-table

这是一个我一直试图解决几个小时的简单问题。我有一个数组包含几个学生的信息和他们在测试中得分的标记。总共有8个科目,每个科目有5个参数。

数组如下所示:

Array
(
    [Ron] => Array
        (
            [subject1] => Array
                (
                    [test1] => 47
                    [test2] => 86
                    [total] => 133
                    [percentage] => 88.67
                    [status] => Pass
                )
            [pass_count] => 8
            [fail_count] => 0
            [gross_total] => 963
            [gross_percentage] => 80.25

            [...]

            [subject8] => Array
                (
                    [test1] => 48
                    [test2] => 86
                    [total] => 134
                    [percentage] => 89.33
                    [status] => Pass
                )

            [pass_count] => 8
            [fail_count] => 0
            [gross_total] => 900
            [gross_percentage] => 75.50
        )

    [John] => Array
        (
            [subject1] => Array
                (
                    [test1] => 39
                    [test2] => 72
                    [total] => 111
                    [percentage] => 74
                    [status] => Pass
                )
            [pass_count] => 8
            [fail_count] => 0
            [gross_total] => 963
            [gross_percentage] => 80.25

            [...]                

            [subject8] => Array
                (
                    [test1] => 39
                    [test2] => 75
                    [total] => 114
                    [percentage] => 76
                    [status] => Pass
                )

            [pass_count] => 8
            [fail_count] => 0
            [gross_total] => 846
            [gross_percentage] => 70.5
        )

)

我需要在一个格式良好的HTML表格中显示以下内容(我打算使用Bootstrap),但我不能为我的生活找出如何使用PHP正确地嵌套表

这是我目前拥有的HTML标记:http://jsfiddle.net/9y910uvp/

这给出了以下结果:

哪个好。

实际问题

我正在使用PHP来显示数组中的内容。我很困惑如何显示嵌套的<tr><td>部分的值。

如何循环播放数组并正确显示内容? (到目前为止我发布了我的尝试,但他们都是愚蠢的,没有工作,所以我不发帖)。

我会非常感激一个例子,因为我花了无数个小时试图让这个工作,但失败了。

3 个答案:

答案 0 :(得分:3)

不完全相同的输出,但这是一个递归方法,应该处理任何深度的嵌套数组...

<?php

$data = Array (
    "Ron" => Array (
            "subject1" => Array (
               "tests" => Array (
                    "test1" => 47,
                    "test2" => 86,
                    "total" => 133,
                    "percentage" => 88.67,
                    "status" => "Pass",
                ),
                "pass_count" => 8,
                "fail_count" => 0,
                "gross_total" => 963,
                "gross_percentage" => 80.25,
            ),


            "subject8" => Array (
               "tests" => Array (
                    "test1" => 48,
                    "test2" => 86,
                    "total" => 134,
                    "percentage" => 89.33,
                    "status" => "Pass",
                ),
                "pass_count" => 8,
                "fail_count" => 0,
                "gross_total" => 900,
                "gross_percentage" => 75.50,

             ),
    ),

    "John" => Array (
            "subject1" => Array (  
               "tests" => Array (
                    "test1" => 39,
                    "test2" => 72,
                    "total" => 111,
                    "percentage" => 74,
                    "status" => "Pass",
                ),
                "pass_count" => 8,
                "fail_count" => 0,
                "gross_total" => 963,
                "gross_percentage" => 80.25,

            ),

            "subject8" => Array (
                "tests" => Array (
                    "test1" => 39,
                    "test2" => 75,
                    "total" => 114,
                    "percentage" => 76,
                    "status" => "Pass",

                ),
                "pass_count" => 8,
                "fail_count" => 0,
                "gross_total" => 846,
                "gross_percentage" => 70.5,
            ),
        ),
);


print_r($data);
$table = table_cell($data);
echo $table;


function table_cell($data) {

  $return = "<table border='1'>";
  foreach ($data as $key => $value) {
    $return .= "<tr><td>$key</td><td>";
    if (is_array($value)) {
        $return .= table_cell($value);
    } else {
        $return .= $value;
    }
    $return .= "</td><tr>";
  }
  $return .= "</tr></table>";
  return($return);

}

并且表格看起来没有像请求的那样......但这是一个有趣的例外......

table output

答案 1 :(得分:2)

试试这个

<table border="1">
    <thead>
    <thead>
        <tr>
            <th>Name</th>
            <th>Subject</th>
            <th>Test1 Marks</th>
            <th>Test2 Marks</th>
            <th>Total Marks</th>
            <th>Status</th>
            <th>Percentage</th>
            <th>Pass Count</th>      
            <th>Total Percentage</th>
        </tr>
    </thead>
    <tbody>

        </tr>
        <?php
        $numberOfSubjects = 3; //I used 3 subjects. You should change this to 8 for your data.
        foreach ($data as $student => $info) {
            echo "<tr><td rowspan=$numberOfSubjects />$student</td>";

            //flag to let the inner loop the tr has been drawn for the first row
            $firstRow = true;
            foreach ($info as $key => $value) {

                //we only want subject info
                if (strpos($key, "subject") === 0) {
                    if (!$firstRow) {
                        echo "<tr>";
                    } //else we already drew it

                    //its a subject so
                    echo "<td>$key</td>";
                    echo "<td>{$value['test1']}</td>";
                    echo "<td>{$value['test2']}</td>";
                    echo "<td>{$value['total']}</td>";
                    echo "<td>{$value['status']}</td>";
                    echo "<td>{$value['percentage']}</td>";

                    //only draw total for the first row
                    if ($firstRow) {
                        echo "<td rowspan=$numberOfSubjects>{$info['pass_count']}</td>";
                        echo "<td rowspan=$numberOfSubjects>{$info['gross_percentage']}</td>";
                    }
                    //close the row
                    echo "</tr>";
                    $firstRow = false;
                }
            }
        }
        ?>
    </tbody>
</table>

这是输出:

enter image description here

它基于我根据您的描述构建的样本数据集,下面包含完整性:

<?php
$data = array(
    "Ron" => Array
        (
        "subject1" => Array
            (
            "test1" => 47
            , "test2" => 86
            , "total" => 133
            , "percentage" => 88.67
            , "status" => Pass
        )
        , "pass_count" => 8
        , "fail_count" => 0
        , "gross_total" => 963
        , "gross_percentage" => 80.25,
        "subject2" => Array
            (
            "test1" => 47
            , "test2" => 86
            , "total" => 133
            , "percentage" => 88.67
            , "status" => Pass
        )
        , "subject3" => Array
            (
            "test1" => 48
            , "test2" => 86
            , "total" => 134
            , "percentage" => 89.33
            , "status" => Pass
        )
        , "pass_count" => 8
        , "fail_count" => 0
        , "gross_total" => 900
        , "gross_percentage" => 75.50
    ),
    "John" => Array
        (
        "subject1" => Array
            (
            "test1" => 47
            , "test2" => 86
            , "total" => 133
            , "percentage" => 88.67
            , "status" => Pass
        )
        , "pass_count" => 8
        , "fail_count" => 0
        , "gross_total" => 963
        , "gross_percentage" => 80.25,
        "subject2" => Array
            (
            "test1" => 47
            , "test2" => 86
            , "total" => 133
            , "percentage" => 88.67
            , "status" => Pass
        )
        , "subject3" => Array
            (
            "test1" => 48
            , "test2" => 86
            , "total" => 134
            , "percentage" => 89.33
            , "status" => Pass
        )
        , "pass_count" => 8
        , "fail_count" => 0
        , "gross_total" => 963
        , "gross_percentage" => 80.25
    )
);

答案 2 :(得分:1)

从您的阵列判断,这可能与您正在寻找的内容类似:

<table border="1">
    <thead>
        <tr>
            <th>Name</th>
            <th>Subject</th>
            <th>Test1 Marks</th>
            <th>Test2 Marks</th>
            <th>Total Marks</th>
            <th>Status</th>
            <th>Percentage</th>
            <th>Pass Count</th>      
            <th>Total Percentage</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($arr as $name => $subjects): ?>
            <?php $i = 0; ?>
            <?php foreach($subjects as $subjectName => $subject): ?>
                <?php if (is_array($subject)): ?>
                    <tr>
                        <?php if ($i === 0): ?>
                            <td rowspan="8"><?php echo $name; ?></td>
                        <?php endif; ?>
                        <td><?php echo $subjectName; ?></td>
                        <td><?php echo $subject['test1']; ?></td>
                        <td><?php echo $subject['test2']; ?></td>
                        <td><?php echo $subject['total']; ?></td>
                        <td><?php echo $subject['status']; ?></td>
                        <td><?php echo $subject['percentage']; ?></td>     
                        <?php if ($i === 0): ?>
                            <td rowspan="8"><?php echo $subjects['pass_count']; ?></td>
                            <td rowspan="8"><?php echo $subjects['gross_percentage']; ?></td>
                        <?php endif; ?>
                    </tr>
                <?php endif; ?>
                <?php $i++; ?>
            <?php endforeach; ?>
        <?php endforeach; ?>
    </tbody>
</table>
相关问题