Rohit Sharma
Rohit Sharma

Reputation: 169

How do I get the exact output from PHP associative array

I am trying to create a html table using foreach loop on associative array. Here is more detail about the array.

 <?php
$assoc_array = array(
    "0" => array(
        "project_id" => "1",
        "emp_id" => "123",
        "emp_name" => "Max",
        "project" => "Java"        
    ),
    "1" => array(
        "project_id" => "2",
        "emp_id" => "123",
        "emp_name" => "Max",
        "project" => "Java"        
    ),
    "2" => array(
        "project_id" => "3",
        "emp_id" => "124",
        "emp_name" => "Max",
        "project" => "Java"        
    ),
    "3" => array(
        "project_id" => "4",
        "emp_id" => "124",
        "emp_name" => "Max",
        "project" => "Java"        
    ),

    "4" => array(
        "project_id" => "5",
        "emp_id" => "125",
        "emp_name" => "Max",
        "project" => "Java"        
    ),

    "5" => array(
        "project_id" => "6",
        "emp_id" => "125",
        "emp_name" => "Max",
        "project" => "Java"        
    )
)

?>

enter image description here enter image description here enter image description here

So i am trying to group them with their emp_id. For that i am trying to use this below logic

      <?php
        $assoc_array = array(
            "0" => array(
                "project_id" => "1",
                "emp_id" => "123",
                "emp_name" => "Max",
                "project" => "Java"
            ),
            "1" => array(
                "project_id" => "2",
                "emp_id" => "123",
                "emp_name" => "Max",
                "project" => "Java"
            ),
            "2" => array(
                "project_id" => "3",
                "emp_id" => "124",
                "emp_name" => "Anna",
                "project" => "Angular"
            ),
            "3" => array(
                "project_id" => "4",
                "emp_id" => "124",
                "emp_name" => "Anna",
                "project" => "PHP"
            ),

            "4" => array(
                "project_id" => "5",
                "emp_id" => "125",
                "emp_name" => "John",
                "project" => "Java"
            ),

            "5" => array(
                "project_id" => "6",
                "emp_id" => "125",
                "emp_name" => "John",
                "project" => "Java"
            )
            );
        $prevEmpid = '';
    $tableData = '';
    $tableStartTag = "<table>";
    $tableEndTag = "</table>";
    $wholeData  = "";
    $trFixed  = "<tr><td>project id </td><td>emp id </td><td>emp name</td><td>project</td></tr>";

    foreach($assoc_array as $val) {
         if($val['emp_id'] !== $prevEmpid ) {
             if($tableData) {
                 $wholeData  = $tableStartTag . $trFixed . $tableData . $tableEndTag;
                echo $tableData;
            }
            $wholeData = '';
            $tableData = '';

            $prevEmpid = $val['emp_id'];
        } 
        $tableData .= "<tr><td>" . $val['project_id'] . "</td>"
            . "<td>" . $val['emp_id'] . "<td>" 
            . "<td>" . $val['emp_name'] . "<td>"
            . "<td>" . $val['project'] . "<td></tr>";
    }

But the issue is, I am not getting the last table data since, the element in the foreach loop goes through else condition.

Any small help is really appreciated.

Upvotes: 1

Views: 95

Answers (5)

Rohit Sharma
Rohit Sharma

Reputation: 169

This is how I implemented the logic for the last row in order to complete the html table format.

$prevEmpid = '';
$tableData = '';
$tableStartTag = "<table>";
$tableEndTag = "</table>";
$wholeData  = "";
$trFixed  = "<tr><td>project id </td><td>emp id </td><td>emp name</td><td>project</td></tr>";

foreach($assoc_array as $val) {
     if($val['emp_id'] !== $prevEmpid ) {
         if($tableData) {
             $wholeData  = $tableStartTag . $trFixed . $tableData . $tableEndTag;
            echo $tableData;
        }
        $wholeData = '';
        $tableData = '';

        $prevEmpid = $val['emp_id'];
    } 
    $tableData .= "<tr><td>" . $val['project_id'] . "</td>"
        . "<td>" . $val['emp_id'] . "<td>" 
        . "<td>" . $val['emp_name'] . "<td>"
        . "<td>" . $val['project'] . "<td></tr>";
}
if($tableData) {
             $wholeData  = $tableStartTag . $trFixed . $tableData . $tableEndTag;
            echo $tableData;
        }

Upvotes: 0

Kyaw Kyaw Soe
Kyaw Kyaw Soe

Reputation: 3370

I assume you want multiple tables that group by emp_id.

The solution is first you need to divide emp_id into array group. after that use for loop to create multiple table.

Here the code that group array by emp_id

<?php
$projects = [
        [
            'project_id' => '1',
            'emp_id' => '123',
            'emp_name' => 'Max',
            'project' => 'Java'
        ],
        [
            'project_id' => '2',
            'emp_id' => '123',
            'emp_name' => 'Max',
            'project' => 'Java'
        ],
        [
            'project_id' => '3',
            'emp_id' => '124',
            'emp_name' => 'Max',
            'project' => 'Java'
        ],
        [
            'project_id' => '4',
            'emp_id' => '124',
            'emp_name' => 'Max',
            'project' => 'Java'
        ],

        [
            'project_id' => '5',
            'emp_id' => '125',
            'emp_name' => 'Max',
            'project' => 'Java'
        ],

        [
            'project_id' => '6',
            'emp_id' => '125',
            'emp_name' => 'Max',
            'project' => 'Java'
        ]
        ];

    $empGroups = [];
    foreach ($projects as $project) {
        $empGroups[$project['emp_id']][] = $project;
    }
?>

And create html table like this.

<?php foreach ($empGroups as $empGroup) { ?>
<table>
    <tr>
        <td>project_id</td>
        <td>emp_id</td>
        <td>emp_name</td>
        <td>project</td>
    </tr>

    <?php foreach ($empGroup as $pjs) { ?>
    <tr>
        <?php foreach ($pjs as $pj) { ?>

        <td>

            <?php echo $pj?>
        </td>
        <?php } ?>

    </tr>
    <?php } ?>

</table>
<?php } ?>

demo

Upvotes: 1

slevy1
slevy1

Reputation: 3820

<?php
// given following array:
$assoc_array = array(
    "0" => array(
        "project_id" => "1",
        "emp_id" => "123",
        "emp_name" => "Max",
        "project" => "Java"
    ),
    "1" => array(
        "project_id" => "2",
        "emp_id" => "123",
        "emp_name" => "Max",
        "project" => "Java"
    ),
    "2" => array(
        "project_id" => "3",
        "emp_id" => "124",
        "emp_name" => "Anna",
        "project" => "Angular"
    ),
    "3" => array(
        "project_id" => "4",
        "emp_id" => "124",
        "emp_name" => "Anna",
        "project" => "PHP"
    ),

    "4" => array(
        "project_id" => "5",
        "emp_id" => "125",
        "emp_name" => "John",
        "project" => "Java"
    ),

    "5" => array(
        "project_id" => "6",
        "emp_id" => "125",
        "emp_name" => "John",
        "project" => "Java"
    )
    );
// you can create function to display table groupings
function print_table($arr){
$prevEmpid = '';
$tableData = '';

$header = "<tr>
        <td>project_id</td><td>emp_id</td><td>emp_name</td><td>project</td>
</tr>";
$temp = '';

echo '<table>',"\n";

foreach($arr as $val) {
// comparing current value of $val['emp_id'] with $temp
if ($val['emp_id'] != $temp) {
        $tableData .= $header;
}

$tableData .= "\n<tr>\n\t<td>".$val['project_id']."</td>";
$tableData .= '<td>'.$val['emp_id']."</td>";
$tableData .= '<td>'.$val['emp_name']."</td>";
$tableData .= '<td>'.$val['project']."</td>\n</tr>\n";
// save current value of $val['emp_id'] in temp 
$temp = $val['emp_id'];
}

echo $tableData,"</table>\n";
}

print_table($assoc_array);

See live code here

Upvotes: 1

splash58
splash58

Reputation: 26153

You are lossing some items because you add output data ($tableData .=) only when id is changing. Remove else operator at all. And add echo after loop to output the last group.

demo

But, you can group the array by a simple code

$new = [];
foreach($assoc_array as $val) {
    $new[$val['emp_id']][] = $val;
}

And then output each group by another loop

Upvotes: 1

user5283119
user5283119

Reputation:

You said

But the issue is, I am not getting the last table data since, the element in the foreach loop goes through else condition

This is because of this bit of code here which sets your $prevEmpid to the one of the current iteration.

if($val['emp_id'] !== $prevEmpid ) {
    if($tableData) {
        echo $tableData;
    }
    $tableData = '';

    $prevEmpid = $val['emp_id'];

} else {
    $tableData .= 'some code to create table with data ';
}

The last item will not show as their emp_id are exactly the same, as your code has specified.

"4" => array(
    "project_id" => "5",
    "emp_id" => "125",
    "emp_name" => "John",
    "project" => "Java"
),

"5" => array(
    "project_id" => "6",
    "emp_id" => "125",
    "emp_name" => "John",
    "project" => "Java"
)

Upvotes: 1

Related Questions