Сложный многомерный массив генерирует таблицу - PullRequest
1 голос
/ 27 января 2020

Привет, ребята,

У меня есть массив, который выглядит так:

{
    "DEP_A": {
        "0": {
            "Austria": [
                {
                    "name": "NAME A",
                    "title": "TITLE A",
                    "email": "EMAIL A",
                    "phone": "PHONE A"
                }
            ],
            "rowspan": 1
        },
        "1": {
            "Croatia": [
                {
                    "name": "NAME AA",
                    "title": "TITLE AA",
                    "email": "EMAIL AA",
                    "phone": "PHONE AA"
                }
            ],
            "rowspan": 1
        },
        "rowspan": 2
    },
    "DEP_B": {
        "0": {
            "Austria": [
                {
                    "name": "NAME B",
                    "title": "TITLE B",
                    "email": "EMAIL B",
                    "phone": "PHONE B"
                }
            ],
            "rowspan": 1
        },
        "1": {
            "Croatia": [
                {
                    "name": "NAME BB",
                    "title": "TITLE BB",
                    "email": "EMAIL BB",
                    "phone": "PHONE BB"
                }
            ],
            "rowspan": 1
        },
        "rowspan": 2
    },
    "DEP_C": {
        "0": {
            "Croatia": [
                {
                    "name": "NAME C",
                    "title": "TITLE C",
                    "email": "EMAIL C",
                    "phone": "PHONE C"
                }
            ],
            "rowspan": 1
        },
        "rowspan": 1
    },
    "VAT DEP_D": {
        "0": {
            "Austria": [
                {
                    "name": "NAME D",
                    "title": "TITLE D",
                    "email": "EMAIL D",
                    "phone": "PHONE D"
                },
                {
                    "name": "NAME DD",
                    "title": "TITLE DD",
                    "email": "EMAIL DD",
                    "phone": "PHONE DD"
                }
            ],
            "rowspan": 2
        },
        "1": {
            "Croatia": [
                {
                    "name": "NAME DDD",
                    "title": "TITLE DDD",
                    "email": "EMAIL DDD",
                    "phone": "PHONE DDD"
                }
            ],
            "rowspan": 1
        },
        "2": {
            "Czech Republic": [
                {
                    "name": "NAME DDDD",
                    "title": "TITLE DDDD",
                    "email": "EMAIL DDDD",
                    "phone": "PHONE DDDD"
                },
                {
                    "name": "NAME DDDDD",
                    "title": "TITLE DDDDD",
                    "email": "EMAIL DDDDD",
                    "phone": "PHONE DDDDD"
                }
            ],
            "rowspan": 2
        }
        "rowspan": 5
    }
}

Вывод HTML должен быть таким:

   <tr>
      <td rowspan="2">DEP_A</td>
      <td rowspan="1">AUSTRIA</td>
      <td>NAME A</td>
      <td>TITLE A</td>
      <td>EMAIL A</td>
      <td>PHONE A</td>
   </tr>
   <tr>
      <td rowspan="1">CROATIA</td>
      <td>NAME AA</td>
      <td>TITLE AA</td>
      <td>EMAIL AA</td>
      <td>PHONE AA</td>
   </tr>
   <tr>
      <td rowspan="2">DEP_B</td>
      <td rowspan="1">AUSTRIA</td>
      <td>NAME B</td>
      <td>TITLE B</td>
      <td>EMAIL B</td>
      <td>PHONE B</td>
   </tr>
   <tr>
      <td rowspan="1">CROATIA</td>
      <td>NAME BB</td>
      <td>TITLE BB</td>
      <td>EMAIL BB</td>
      <td>PHONE BB</td>
   </tr>
   <tr>
      <td rowspan="1">DEP_C</td>
      <td rowspan="1">CROATIA</td>
      <td>NAME C</td>
      <td>TITLE C</td>
      <td>EMAIL C</td>
      <td>PHONE C</td>
   </tr>
   <tr>
      <td rowspan="5">DEP_D</td>
      <td rowspan="2">AUSTRIA</td>
      <td>NAME D</td>
      <td>TITLE D</td>
      <td>EMAIL D</td>
      <td>PHONE D</td>
   </tr>
   <tr>
      <td>NAME DD</td>
      <td>TITLE DD</td>
      <td>EMAIL DD</td>
      <td>PHONE DD</td>
   </tr>
   <tr>
      <td rowspan="1">CROATIA</td>
      <td>NAME DDD</td>
      <td>TITLE DDD</td>
      <td>EMAIL DDD</td>
      <td>PHONE DDD</td>
   </tr>
   <tr>
      <td rowspan="2">CZECH REPUBLIC</td>
      <td>NAME DDDD</td>
      <td>TITLE DDDD</td>
      <td>EMAIL DDDD</td>
      <td>PHONE DDDD</td>
   </tr>
   <tr>
      <td>NAME DDDDD</td>
      <td>TITLE DDDDD</td>
      <td>EMAIL DDDDD</td>
      <td>PHONE DDDDD</td>
   </tr>

Визуальный вывод выглядит так: https://prnt.sc/qtkqyl

Код, который я написал:

foreach($array as $key => $value){
        /////////////////////
        // COUNTRY COMPARE //
        /////////////////////
        if(isAssoc($b)){
            if($array[$key][$type] > 1){
                // HERE FAILS
            }else{
                //////////////////////////////////////////////////////////////////////////////////////////
                // DONE -> IF COMPARE COUNTRIES BUT A COUNTRY DOESNT HAVE VALUE FOR SPECIFIC DEPARTMENT //
                //////////////////////////////////////////////////////////////////////////////////////////
                $data .= "<tr>";
                    ////////////////
                    // DEPARTMENT //
                    ////////////////
                    $data .= "<td rowspan='" . $value[$type] . "'>" . $key . "</td>";

                    foreach($value as $k => $v){
                        /////////////
                        // COUNTRY //
                        /////////////
                        if(!is_numeric($v)){
                            $data .= "<td rowspan='" . $value[$type] . "'>" . $k . "</td>";
                        }

                        ////////////////////
                        // REST OF VALUES //
                        ////////////////////
                        foreach($v as $key_v => $value_v){
                            foreach($value_v as $kv => $vv){
                                $data .= "<td>" . $vv . "</td>";
                            }
                        }
                    }
                $data .= "</tr>";
            }

        ////////////////
        // NO COMPARE //
        ////////////////
        }else{
            //////////
            // DONE //
            //////////
            $data .= pretty_print('i should not enter here while multiple countries are selected');

            //////////////////////
            // IF MULTIPLE ROWS //
            //////////////////////
            if($array[$key][$type] > 1){
                $data .= "<tr>";
                    ////////////////
                    // DEPARTMENT //
                    ////////////////
                    $data .= "<td rowspan='" . $value[$type] . "'>" . $key . "</td>";

                    ///////////////////////
                    // REST OF FIRST ROW //
                    ///////////////////////
                    foreach($value[0] as $k => $v){
                        $data .= "<td>" . $v . "</td>";
                    }
                $data .= "</tr>";

                /////////////////////////////////////////////////////////////
                // REST OF MULTIPLE VALUES DEPARTMENT STARTING WITH SECOND //
                /////////////////////////////////////////////////////////////
                for($i = 1; $i < $array[$key][$type]; $i++){
                    $data .= "<tr>";
                        foreach($value[$i] as $k => $v){
                            $data .= "<td>" . $v . "</td>";
                        }
                    $data .= "</tr>";
                }
            ///////////////////
            // IF SINGLE ROW //
            ///////////////////
            }else{
                $data .= "<tr>";
                    ////////////////
                    // DEPARTMENT //
                    ////////////////
                    $data .= "<td rowspan='" . $value[$type] . "'>" . $key . "</td>";

                    ////////////////////
                    // REST OF VALUES //
                    ////////////////////
                    foreach($value as $k => $v){
                        foreach($v as $key_v => $value_v){
                            $data .= "<td>" . $value_v . "</td>";
                        }
                    }
                $data .= "</tr>";
            }
        }
    }

Когда он говорит в коде " HERE FAILS ", я должен создать tr с набором строк в массиве, это просто ... но если страна имеет несколько значения, которые я должен создать td со значением диапазона строк в стране, поместить остаток кода (только первые значения), затем разбить tr и создать еще один, начиная со второго значения для этой страны, которая имеет много строк aaaand ... i Я застрял ... пожалуйста, помогите?

РЕДАКТИРОВАТЬ: Забыли добавить зависимости

<code>function isAssoc(array $arr){
    if (array() === $arr) return false;
    return array_keys($arr) !== range(0, count($arr) - 1);
}

function pretty_print($array){
    header('Content-Type: application/json');
    return "<pre>" . json_encode($array, JSON_PRETTY_PRINT) . "
";}
...