Php 从具有行跨度的数组/多维数组生成动态表
嗨,伙计们!我想使用数组或多维数组中的数据创建一个带有tr的表 我的阵列是动态的,它可以看起来像:Php 从具有行跨度的数组/多维数组生成动态表,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,嗨,伙计们!我想使用数组或多维数组中的数据创建一个带有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 t
{
"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>";
}
}
}
$duplicate_keys=array();
$country\u multiple\u rows=false;
$first_row_has_m_row=1;
$middle_row_multiple=0;
$skip_first_row=0;
//查找行数
foreach($index=>$result的数组){
/////////////////////////////
/////////////////////////////
//如果表位于3个级别上//
/////////////////////////////
/////////////////////////////
如果(isAssoc(结果)){
//比较国家
foreach($head=>$content的结果){
如果(isset($头)){
$duplicate_keys[$index][$head]=计数($result[$head]);
}
}
/////////////////////////////////////////////////////
//如果增值税联系人和国家有多个条目
/////////////////////////////////////////////////////
如果(计数($result)>1){
$data.=“”;
foreach($vk=>$vv的结果){
//获取部门行高度
foreach($country\u index=>$country\u行的重复\u键[$index]{
$部门中的多个国家/地区+=$国家/地区行;
}
如果($部门中的多个国家/地区>1){
//多行增值税部门
$data.=''.$index.'';
}否则{
//增值税部门
$data.=''.$index.'';
}
$vat_部门=$index;
$country\u of_department=$vk;
if($duplicate_keys[$vat_department][$country_of_department]>1){
$first_row_有_m_row+=1;
}
//仅表格第一行
foreach($vv[0]为$i=>$v){
if($duplicate_keys[$vat_department][$country_of_department]>1&&$v====$country_of_department){
$data.=''.$v.'';
}否则{
$data.=''.$v.'';
}
}
打破
}
$data.=“”;
//列出其他值
$keys=数组_键($array[$vat_department]);
如果($first_row_has_m_row>1){
对于($i=0;$i1){
foreach($array[$vat\U department][$keys[$i]][0]为$q=>$w){
如果($w===$keys[$i]){
$data.=''.$w.'';
}否则{
$data.=''.$w.'';
}
$部门=$增值税部门;
$department_country=$keys[$i];
$last_row_multiple++;
}
}否则{
foreach($array[$vat\U department][$keys[$i]]作为$index=>$value){
foreach($j=>l){
如果($l===$keys[$i]&&$duplicate\U keys[$vat\U department][$l]>1){
$data.=''.$l.'';
}否则{
$data.=''.$l.'';
}
}
}
}
//如果(是数组($array[$vat\u department][$keys[$i]])){
//foreach($array[$vat\U department][$keys[$i]]作为$index=>$value){
////跳过上面定义的第一个值
//如果($skip_first_row++==0)继续;
//foreach($j=>l){
//如果($country\u of\u department!==$l){
//$data.=''.$l.'';
// }
// }
// }
// }
$data.=“”;
}
}否则{
$keys=数组_键($array[$vat_department]);
对于($i=1;$i1){
foreach($array[$vat\U department][$keys[$i]][0]为$q=>$w){
如果($w===$keys[$i]){
$data.=''.$w.'';
}否则{
$data.=''.$w.'';
}
$部门=$增值税部门;
$department_country=$keys[$i];
$middle_row_multiple++;
}
}否则{
foreach($array[$vat\U department][$key)