John Stamoutsos John Stamoutsos - 5 months ago 11
PHP Question

PHP How can close the html tags from this array?

I have that array with html tags and i need make an output with some function with PHP but i can not make it correct i need some help to make this array closing tags correct.

This array is already builded line by line but i can not make the parents.

The OUTPUT NEEDED:

<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>


The PHP array have already builded:

$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
]
];


And this is the function with incorrect output:

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));

Answer

Nesting arrays and using recursion may look like this:

<?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',
            ],
        ],
    ],
];

And code for generating html like this:

<?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));
Comments