Распечатать массив PHP в табличных представлениях с помощью foreach - PullRequest
1 голос
/ 14 июля 2020

Я новичок ie в разработке, и у меня проблемы с этим ниже logi c.

Это мой образец БД.

$data = array(3) {
$x_count = 2;
[1] =>  $name = 'A';
        $y_count = 2;
        array(2) {
            [1] =>  $name = 'A.1';
                    $z_count = 2;
                    array(2) {
                        [1] =>  $name = 'A.1.a';
                                $val = 1;
                        [2] =>  $name = 'A.1.b';
                                $val = 1;
                    }
            [2] =>  $name = 'A.2';
                    $z_count = 2;
                    array(2) {
                        [1] =>  $name = 'A.2.a';
                                $val = 2;
                        [2] =>  $name = 'A.2.b';
                                $val = 2;
                    }
        }
[2] =>  $name = 'B';
        $y_count = 2;
        array(2) {
            [1] =>  $name = 'B.1';
                    $z_count = 2;
                    array(2) {
                        [1] =>  $name = 'B.1.a';
                                $val = 3;
                        [2] =>  $name = 'B.1.b';
                                $val = 3;
                    }
            [2] =>  $name = 'A.2';
                    $z_count = 2;
                    array(2) {
                        [1] =>  $name = 'B.2.a';
                                $val = 4;
                        [2] =>  $name = 'B.2.b';
                                $val = 4;
                    }
        }
}

И мне нужно распечатать вот так enter image description here

I have no idea of using foreach loop to print data into this table or caculating the number of "colspan" for each of x, y, z title.

I really hope to receive some advice. Thanks a lot!

EDIT: the x_count, y_count and z_count are variables get from DB and it's not only 2. EDIT2: my expected result looks like this:

        
        
            x_name
             A  В  СУММ    y_name  А.1  А.2  СУММА  В.1  В.2  СУММ    z_name  A.1.a  A.1.b  СУММ  A .2.a  A.2.b  СУММ  B.1.a  B.1.b  СУММ  B.2.a  B.2.b  SUM    значение  1  1  2  2  2  4  6  3  3  6  4  4  8  14  20    

1 Ответ

1 голос
/ 14 июля 2020

Вам не нужно добавлять y_count, x_count, вместо этого вы можете использовать функцию count() для объекта $data.

Здесь - это структура HTML I Создано, вы можете посмотреть

Для упрощения обработки данных вы можете рассмотреть возможность использования моей структуры данных ниже

$data = [
    [
        "name" => 'A', // x_name
        "children" => [
            [
                "name" => 'A.1', // y_name
                "children" => [
                    [
                        "name" => 'A.1.a', // z_name
                        "value" => 1
                    ],
                ]
            ]
        ]
    ],
    ...
];

ПРИМЕЧАНИЕ. Все коды logi c ниже используется для предоставленного вами HTML, а не для моего jsFiddle HTML

Первый шаг : Запустите al oop для каждого элемента массива $ data для обработки x_name данные. Назначьте каждую строку html переменной для дальнейшего использования

/* Init html variable for $x_name, $y_name, $z_name, $value */
$x_html = '';
$y_html = '';
$z_html = '';
$value_html = '';
foreach ($data as $x_index => $x_data) {
    $x_children = $x_data['children'];
    $x_colspan = 1; // this variable will be sum of 1 'SUM' column and each $y_colspan
    foreach ($x_children as $y_index => $y_data) {
        $y_children = $x_data['children'];
        $y_colspan = count($y_children) + 1; // all of y's children column + SUM column

        // Update x_colspan
        $x_colspan += $y_colspan;

        // process assign html to $y_html
        $y_html .= '<td colspan = "'.$y_colspan.'">'.$y_data['name'].'</td>';
        // add SUM column
        if ($y_index == count($x_children)-1) {
            $y_html .= '<td>SUM</td>';
        }

        $sum = 0;
        foreach ($y_children as $z_index => $z_data) {
            $z_value = $z_data['value'];
            $z_html .= '<td>'.$z_data['name'].'</td>';
            // add SUM column for every looped 2 $z_data column
            if ($z_index == count($y_children)-1) {
                $z_html .= '<td>SUM</td>';
            }

            $sum += $z_value; // sum all value of current y_children
            $value_html .= '<td>'.$z_data['value'].'</td>';
        }
        // After finish assign z_html, value_html, sum it all
        $value_html .= '<td>'.$sum.'</td>'
    }


    $x_html .= '<td colspan = "'.$x_colspan.'">'.$x_data['name'].'</td>';
}

Последний шаг : вы распечатываете всю переменную x_ html, y_ html, z_ html, value_ html. Объедините его с реальной таблицей html

$table_html = '
<table>
    <tr>
        <th>x_name</th>
        '.$x_html.'
        <th rowspan = "3">SUM</th>
    </tr>
    <tr>
        <th>y_name</th>
        '.$y_html.'
    </tr>
    <tr>
        <th>z_name</th>
        '.$z_html.'
    </tr>
    <tr>
        <th>z_name</th>
        '.$value_html.'
    </tr>
</table>
';

Этот код выше может не работать, это просто идея. Надеюсь, это поможет вам

...