Reputation: 169
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"
)
)
?>
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
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
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.
<?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;
}
?>
<?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 } ?>
Upvotes: 1
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
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.
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
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