Вам не нужно добавлять 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>
';
Этот код выше может не работать, это просто идея. Надеюсь, это поможет вам