Создание таблицы Dynami c из многомерного массива / массива с интервалами строк - PullRequest
1 голос
/ 27 января 2020

Привет, ребята! Я хочу создать таблицу с 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

Не те из примеров массивов, но вы поймете точку.

...