Привет, ребята! Я хочу создать таблицу с tr, используя данные из массива или многомерного массива.
Мои массивы являются динамическими, они могут выглядеть следующим образом:
{
"FIRST TD IN FIRST TR -> tr rowspan=1": [
{
"name -> second td in first tr": "x",
"title -> third td in first tr": "y",
"email -> fourth td in first tr": "z",
"phone -> fifth td in first tr": "0"
}
],
"FIRST TD IN SECOND TR -> tr rowspan=1": [
{
"name -> second td in second tr": "x",
"title -> third td in second tr": "y",
"email -> fourth td in second tr": "z",
"phone -> fifth td in second tr": "0"
}
],
"FIRST TD IN THIRD TR -> tr rowspan=2": [
{
"name -> second td in third tr": "x",
"title -> third td in third tr": "y",
"email -> fourth td in third tr": "z",
"phone -> fifth td in third tr": "0"
},
{
"name -> second td in fourth tr": "x",
"title -> third td in fourth tr": "y",
"email -> fourth td in fourth tr": "z",
"phone -> fifth td in fourth tr": "0"
}
]
}
Еще один это может выглядеть так:
{
"FIRST TD IN FIRST TR -> rowspan 2": {
"SECOND TD IN FIRST TR -> rowspan 1": [
{
"name -> third td in first tr": "x",
"title -> fourth td in first tr": "y",
"email -> fifth td in first tr": "z",
"phone -> sixth td in first tr": "0"
}
],
"FIRST TD IN SECOND TR -> indented because of parent tr rowspan": [
{
"name -> second td in second tr": "x",
"title -> third td in second tr": "y",
"email -> fourth td in second tr": "z",
"phone -> fifth td in second tr": "0"
}
]
},
"FIRST TD IN THIRD TR -> rowspan 2": {
"SECOND TD IN THIRD TR -> rowspan 1": [
{
"name -> third td in third tr": "x",
"title -> fourth td in third tr": "y",
"email -> fifth td in third tr": "z",
"phone -> sixth td in third tr": "0"
}
],
"FIRST TD IN FOURTH TR -> indented because of parent tr rowspan": [
{
"name -> second td in fourth tr": "x",
"title -> third td in fourth tr": "y",
"email -> fourth td in fourth tr": "z",
"phone -> fifth td in fourth tr": "0"
}
]
},
"FIRST TD IN FIFTH TR -> rowspan 1": {
"SECOND TD IN FIFTH TR -> rowspan 1": [
{
"name -> third td in fifth tr": "x",
"title -> fourth td in fifth tr": "y",
"email -> fifth td in fifth tr": "z",
"phone -> sixth td in fifth tr": "0"
}
]
},
"FIRST TD IN SIXTH TR -> rowspan 3": {
"SECOND TD IN SIXTH TR -> rowspan 2": [
{
"name -> third td in SIXTH tr": "x",
"title -> fourth td in SIXTH tr": "y",
"email -> fifth td in SIXTH tr": "z",
"phone -> sixth td in SIXTH tr": "0"
},
----> next one indented because of parent rowspan (2)
{
"name -> third td in seventh tr": "x",
"title -> fourth td in seventh tr": "y",
"email -> fifth td in seventh tr": "z",
"phone -> sixth td in seventh tr": "0"
}
],
"SECOND TD IN EIGHT TR -> rowspan 1": [
{
"name -> third td in EIGHT tr": "x",
"title -> fourth td in EIGHT tr": "y",
"email -> fifth td in EIGHT tr": "z",
"phone -> sixth td in EIGHT tr": "0"
}
]
}
}
Дело в том, что массивы могут быть на двух уровнях или на трех уровнях.
Мой код:
$duplicate_keys = array();
$country_multiple_rows = false;
$first_row_has_m_row = 1;
$middle_row_multiple = 0;
$skip_first_row = 0;
// find nr of rows
foreach($array as $index => $result){
/////////////////////////////
/////////////////////////////
// IF TABLE IS ON 3 LEVELS //
/////////////////////////////
/////////////////////////////
if(isAssoc($result)){
// COMPARED COUNTRIES
foreach($result as $head => $content){
if(isset($head)){
$duplicate_keys[$index][$head] = count($result[$head]);
}
}
/////////////////////////////////////////////////////
// if VAT CONTACT PERSON AND COUNTRY HAS MANY ENTRIES
/////////////////////////////////////////////////////
if(count($result) > 1){
$data .= "<tr class='initial_row'>";
foreach($result as $vk => $vv){
// get department row_height
foreach($duplicate_keys[$index] as $country_index => $country_rows){
$multiple_countries_in_department += $country_rows;
}
if($multiple_countries_in_department > 1){
// vat department with multiple rows
$data .= "<td " . $type . "='" . $multiple_countries_in_department . "'>" . $index . "</td>";
}else{
// vat department
$data .= "<td>" . $index . "</td>";
}
$vat_department = $index;
$country_of_department = $vk;
if($duplicate_keys[$vat_department][$country_of_department] > 1){
$first_row_has_m_row += 1;
}
// table only first row
foreach($vv[0] as $i => $v){
if($duplicate_keys[$vat_department][$country_of_department] > 1 && $v === $country_of_department){
$data .= "<td " . $type . "='" . $duplicate_keys[$vat_department][$country_of_department] . "'>" . $v . "</td>";
}else{
$data .= "<td>" . $v . "</td>";
}
}
break;
}
$data .= "</tr>";
// list other values
$keys = array_keys($array[$vat_department]);
if($first_row_has_m_row > 1){
for($i = 0; $i < count($array[$vat_department]); $i++){
$data .= "<tr class='rest_of_initial_row'>";
if(count($array[$vat_department][$keys[$i]]) > 1){
foreach($array[$vat_department][$keys[$i]][0] as $q => $w){
if ($w === $keys[$i]){
$data .= "<td " . $type . "='" . $duplicate_keys[$vat_department][$w] . "'>" . $w . "</td>";
}else{
$data .= "<td>" . $w . "</td>";
}
$department = $vat_department;
$department_country = $keys[$i];
$last_row_multiple++;
}
}else{
foreach($array[$vat_department][$keys[$i]] as $index => $value){
foreach($value as $j => $l){
if ($l === $keys[$i] && $duplicate_keys[$vat_department][$l] > 1){
$data .= "<td " . $type . "='" . $duplicate_keys[$vat_department][$l] . "'>" . $l . "</td>";
}else{
$data .= "<td>" . $l . "</td>";
}
}
}
}
// if(is_array($array[$vat_department][$keys[$i]])){
// foreach($array[$vat_department][$keys[$i]] as $index => $value){
// // skip first value as it is defined above
// if ($skip_first_row++ === 0) continue;
// foreach($value as $j => $l){
// if($country_of_department !== $l){
// $data .= "<td>" . $l . "</td>";
// }
// }
// }
// }
$data .= "</tr>";
}
}else{
$keys = array_keys($array[$vat_department]);
for($i = 1; $i < count($array[$vat_department]); $i++){
$data .= "<tr class='secondary_row'>";
if(count($array[$vat_department][$keys[$i]]) > 1){
foreach($array[$vat_department][$keys[$i]][0] as $q => $w){
if ($w === $keys[$i]){
$data .= "<td " . $type . "='" . $duplicate_keys[$vat_department][$w] . "'>" . $w . "</td>";
}else{
$data .= "<td>" . $w . "</td>";
}
$department = $vat_department;
$department_country = $keys[$i];
$middle_row_multiple++;
}
}else{
foreach($array[$vat_department][$keys[$i]] as $index => $value){
foreach($value as $j => $l){
if ($l === $keys[$i] && $duplicate_keys[$vat_department][$l] > 1){
$data .= "<td " . $type . "='" . $duplicate_keys[$vat_department][$l] . "'>" . $l . "</td>";
}else{
$data .= "<td>" . $l . "</td>";
}
}
}
}
$data .= "</tr>";
}
if($array[$department][$department_country]){
if($last_row_multiple !== 0){
for($j = 0; $j < count($array[$department][$department_country]); $j++){
$data .= "<tr class='rest_of_secondary_rows'>";
foreach($array[$department][$department_country][$j] as $q => $w){
if ($w !== $department_country){
$data .= "<td>" . $w . "</td>";
}
}
$data .= "</tr>";
}
}
}
if($array[$department][$department_country]){
if($middle_row_multiple !== 0){
for($j = 1; $j < count($array[$department][$department_country]); $j++){
$data .= "<tr class='rest_of_secondary_rows'>";
foreach($array[$department][$department_country][$j] as $q => $w){
if ($w !== $department_country){
$data .= "<td>" . $w . "</td>";
}
}
$data .= "</tr>";
}
}
}
}
$multiple_countries_in_department = 0;
$first_row_has_m_row = 1;
$middle_row_multiple = 0;
/////////////////////////////////////////
// if VAT CONTACT PERSON HAS SINGLE ENTRY
/////////////////////////////////////////
}else{
$data .= "<tr>";
foreach($result as $rk => $rv){
// create left headers
foreach($duplicate_keys[$index] as $dk => $dv){
$data .= "<td " . $type . "='" . $dv . "'>" . $index . "</td>";
// if country has multiple values
if($dv > 1){
$country_multiple_rows = true;
$row_height = $duplicate_keys[$index][$rk];
$country_duplicate_name = $rk;
// identify COUNTRY
foreach($rv[0] as $h => $v){
// if name is equal to loop item
if($v === $rk){
$data .= "<td " . $type . "='" . $duplicate_keys[$index][$rk] . "'>" . $v . "</td>";
// other country contact details
}else{
$data .= "<td>" . $v . "</td>";
}
}
break 2;
}else{
foreach($rv as $h => $v){
foreach($v as $vh => $vv){
$data .= "<td " . $type . "='" . $duplicate_keys[$index][$rk] . "'>" . $vv . "</td>";
}
}
}
}
}
$data .= "</tr>";
if($country_multiple_rows){
// 2nd++ row of country
for($i = 1; $i < $row_height; $i++){
$data .= "<tr>";
foreach($array[$index][$country_duplicate_name][$i] as $ih => $iv){
if($iv !== $country_duplicate_name){
$data .= "<td>" . $iv . "</td>";
}
}
$data .= "</tr>";
}
}
$country_multiple_rows = false;
}
/////////////////////////////
/////////////////////////////
// IF TABLE IS ON 2 LEVELS //
/////////////////////////////
/////////////////////////////
}else{
////////////////
// NO COMPARE //
////////////////
$duplicate_keys[$index] = count($result);
/////////////////////////////////////////
// if VAT CONTACT PERSON HAS MANY ENTRIES
/////////////////////////////////////////
if(count($result) > 1){
$data .= "<tr>";
foreach($result as $vk => $vv){
// table left header
$data .= "<td " . $type . "='" . $duplicate_keys[$index] . "'>" . $index . "</td>";
// table only first row
foreach($result[0] as $i => $v){
$data .= "<td>" . $v . "</td>";
}
break;
}
$data .= "</tr>";
// list other values
for($i = 1; $i < count($result); $i++){
$data .= "<tr>";
foreach($result[$i] as $index => $value){
$data .= "<td>" . $value . "</td>";
}
$data .= "</tr>";
}
/////////////////////////////////////////
// if VAT CONTACT PERSON HAS SINGLE ENTRY
/////////////////////////////////////////
}else{
$data .= "<tr>";
foreach($result as $rk => $rv){
// create left headers
$data .= "<td " . $type . "='" . $duplicate_keys[$index] . "'>" . $index . "</td>";
foreach($rv as $h => $v){
// show data
$data .= "<td>" . $v . "</td>";
}
}
$data .= "</tr>";
}
}
}
Использование Мой код разрушает макет таблицы, поскольку не создает новые tr, когда его нужно создать, или сохраняет l oop и добавляет больше tds в один tr, который должен разделиться на больше tr.
Вот как это должно выглядеть: https://prnt.sc/qt8s5t
И более сложный: https://prnt.sc/qt8rk6
Не те из примеров массивов, но вы поймете точку.