PHP How can close the html tags from this array?

浪尽此生 提交于 2019-12-08 07:12:45

问题


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

回答1:


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

To nest your original data here is the nesting function:

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


来源:https://stackoverflow.com/questions/37823434/php-how-can-close-the-html-tags-from-this-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!