6

This is a simple problem that I've been trying to solve for several hours. I have an array containing information of several students and marks they scored in tests. There are 8 subjects in total, with each subject having 5 parameters.

The array looks like below:

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
        )

)

I need to display the following in a nicely formatted HTML table (I'm planning to use Bootstrap), but I can't for the life of me figure out how to properly nest the table using PHP.

This is the HTML markup that I currently have: http://jsfiddle.net/9y910uvp/

This gives the following result:

Which is okay.

The Actual Problem

I'm using PHP to display the contents from the array. I'm confused how to display the values for the nested <tr> and <td> sections.

How do I loop through the array and display the contents correctly? (I'd post my attempts so far, but they're all stupid and not working so I'm not posting).

An example would be greatly appreciated because I've spent countless hours trying to get this working, but failed terribly.

5
  • ...You really should post whatever worked the best. It's immeasurably helpful. If none of them worked at all, please state that, because even that's helpful information Commented May 2, 2015 at 22:22
  • @QPaysTaxes: None of them worked at all. As I've stated in the question. I'm sorry if it looks like a homework problem, but honestly I've tried so much to do it on my own... and failed. Commented May 2, 2015 at 22:25
  • @AlliterativeAlice: Is this really a nested table? I'm not sure any more. Commented May 2, 2015 at 22:26
  • 1
    @JosephJohn Even if it is homework, it doesn't matter. You've pretty clearly demonstrated at least some effort, rather than saying, say, 'hear my code it dont work plz fix [code dump]' (which is an actual post I saw once sob). I'm gonna dig into what little PHP knowledge I have and see if I can't get this done. Commented May 2, 2015 at 22:28
  • @JosephJohn Post what you have tried, otherwise, instead of helping you, we're just doing the work for you Commented May 2, 2015 at 23:08

3 Answers 3

6

Not quite the same output, but here's a recursive approach that should handle any depth of nested arrays...

<?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);

}

and the table looks nothing like the requested but... it was an interesting excersize...

table output

Sign up to request clarification or add additional context in comments.

1 Comment

To whomever bumped this answer, THANK YOU! I couldn't remember which question I answered with this code, and I need it :-)
2

Try this out

<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>

Here is the output:

enter image description here

Its based on a sample dataset I constructed from your description, included below for completeness:

<?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
    )
);

Comments

1

Judging from your array, this might be something like what you're looking for:

<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>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.