У меня есть массив с html-тегами, и мне нужно сделать вывод с некоторой функцией с PHP, но я не могу сделать это правильно. Мне нужна помощь, чтобы сделать этот тег закрывающим тегами правильным.
Этот массив уже построен по строкам, но я не могу сделать родителей.
НЕОБХОДИМЫЕ ВЫХОДЫ:
<form class="form-horizontal"> <div class="firstclass">FIRSTCLASS</div> <div class="form-group"> <label class="col-sm-3 control-label">TEXT <div class="col-sm-9"> <span class="myspan">MYSPAN <div class="myclass">MYCLASS </div> </span> </div> </label> </div> <div class="firstclass">FIRSTCLASS</div> <div class="form-group"> <label class="col-sm-3 control-label">TEXT <div class="col-sm-9"> <span class="myspan">MYSPAN <div class="myclass">MYCLASS </div> </span> </div> </label> </div> <div class="firstclass">FIRSTCLASS</div> </form>
Массив PHP уже построен:
$data = [ [ 'tag' => 'form', 'options' => ' class="form-horizontal"', 'text' => false, 'level' => 1, 'parents' => true, ], [ 'tag' => 'div', 'options' => ' class="firstclass"', 'text' => 'FIRSTCLASS', 'level' => 2, 'parents' => false, ], [ 'tag' => 'div', 'options' => ' class="form-group"', 'text' => 'FORMGROUP', 'level' => 2, 'parents' => true, ], [ 'tag' => 'label', 'options' => ' class="col-sm-3 control-label"', 'text' => 'TEXT', 'level' => 3, 'parents' => true, ], [ 'tag' => 'div', 'options' => ' class="col-sm-9"', 'text' => false, 'level' => 4, 'parents' => true ], [ 'tag' => 'span', 'options' => ' class="myspan"', 'text' => 'MYSPAN', 'level' => 5, 'parents' => true ], [ 'tag' => 'div', 'options' => ' class="myclass"', 'text' => 'MYCLASS', 'level' => 6, 'parents' => false ], [ 'tag' => 'div', 'options' => ' class="firstclass"', 'text' => 'FIRSTCLASS', 'level' => 2, 'parents' => false ], [ 'tag' => 'div', 'options' => ' class="form-group"', 'text' => 'FORMGROUP', 'level' => 2, 'parents' => true ], [ 'tag' => 'label', 'options' => ' class="col-sm-3 control-label"', 'text' => 'TEXT', 'level' => 3, 'parents' => true ], [ 'tag' => 'div', 'options' => ' class="col-sm-9"', 'text' => false, 'level' => 4, 'parents' => true ], [ 'tag' => 'span', 'options' => ' class="myspan"', 'text' => 'MYSPAN', 'level' => 5, 'parents' => true ], [ 'tag' => 'div', 'options' => ' class="myclass"', 'text' => 'MYCLASS', 'level' => 6, 'parents' => false ], [ 'tag' => 'div', 'options' => ' class="firstclass"', 'text' => 'FIRSTCLASS', 'level' => 2, 'parents' => false ] ];
И это функция с неправильным выходом:
function get($data) { $top= ''; $botttom= ''; foreach($data as $key => $row) { $tag = isset($row['tag']) ? $row['tag'] : false; $text = isset($row['text']) ? $row['text'] : false; $level = isset($row['level']) ? $row['level'] : false; $options = isset($row['options']) ? $row['options'] : false; $parents = isset($row['parents']) ? $row['parents'] : false; $openTag = '<'.$tag.$options.'>'.$text; $closeTag = '</'.$tag.'>'; if($parents) { $top.= $openTag; } else { $botttom = $closeTag.$botttom; } } $result = $top.$botttom; return $result; } echo(get($data));
Вложенные массивы и использование рекурсии могут выглядеть так:
<?php $data = [ [ 'tag' => 'form', 'options' => ' class="form-horizontal"', 'text' => false, 'items' => [ [ 'tag' => 'div', 'options' => ' class="firstclass"', 'text' => 'FIRSTCLASS', ], [ 'tag' => 'div', 'options' => ' class="form-group"', 'text' => 'FORMGROUP', 'items' => [ [ 'tag' => 'label', 'options' => ' class="col-sm-3 control-label"', 'text' => 'TEXT', 'items' => [ [ 'tag' => 'div', 'options' => ' class="col-sm-9"', 'items' =>[ [ 'tag' => 'span', 'options' => ' class="myspan"', 'text' => 'MYSPAN', 'items' => [ [ 'tag' => 'div', 'options' => ' class="myclass"', 'text' => 'MYCLASS', ], ], ], ], ], ], ], ], ], [ 'tag' => 'div', 'options' => ' class="firstclass"', 'text' => 'FIRSTCLASS', ], [ 'tag' => 'div', 'options' => ' class="form-group"', 'text' => 'FORMGROUP', 'items' => [ [ 'tag' => 'label', 'options' => ' class="col-sm-3 control-label"', 'text' => 'TEXT', 'items' => [ [ 'tag' => 'div', 'options' => ' class="col-sm-9"', 'items' => [ [ 'tag' => 'span', 'options' => ' class="myspan"', 'text' => 'MYSPAN', 'items' => [ [ 'tag' => 'div', 'options' => ' class="myclass"', 'text' => 'MYCLASS', ], ], ], ], ], ], ], ], ], [ 'tag' => 'div', 'options' => ' class="firstclass"', 'text' => 'FIRSTCLASS', ], ], ], ];
И код для генерации html:
<?php function get($data) { $result = ''; foreach ($data as $key => $row) { $tag = array_key_exists('tag', $row) ? $row['tag'] : false; $text = array_key_exists('text', $row) ? $row['text'] : ''; $options = array_key_exists('options', $row) ? $row['options'] : ''; $nested = array_key_exists('items', $row) ? get($row['items'])) : ''; if (false === $tag) { continue; // May throw exception or some error handling } $result .= "<{$tag} {$options}>{$text}{$nested}</{$tag}>"; } return $result; } echo(get($data));
Для гнездования исходных данных здесь находится функция вложенности:
function nest(array $data = array()) { $level = null; $last = null; foreach ($data as $index => $item) { $level = $level ?? $item['level']; if (null !== $last && $item['level'] > $level) { $data[$last]['items'][] = $item; unset($data[$index]); } if ($item['level'] == $level) { $last = $index; } } foreach ($data as $index => $item) { if (array_key_exists('items', $item)) { $data[$index]['items'] = nest($item['items']); } } return $data; } print_r(nest($data));die();
неfunction nest(array $data = array()) { $level = null; $last = null; foreach ($data as $index => $item) { $level = $level ?? $item['level']; if (null !== $last && $item['level'] > $level) { $data[$last]['items'][] = $item; unset($data[$index]); } if ($item['level'] == $level) { $last = $index; } } foreach ($data as $index => $item) { if (array_key_exists('items', $item)) { $data[$index]['items'] = nest($item['items']); } } return $data; } print_r(nest($data));die();