繁体   English   中英

递归以从嵌套数组生成HTML

[英]Recursion to generate HTML from nested array

我有以下数组。 我需要创建一个从此类数组构建HTML的函数。 我尝试了递归,但是我的逻辑中有错误。 请帮忙...

$arr = array(
        'div' => array
            (
                0 => "Sample text sample text sample text.",
                1 => array(
                        'ul' => array
                            (
                                'li' => Array
                                    (
                                        0 => "li 0 text.",
                                        1 => "li 1 text.",
                                        2 => "li 2 text."
                                    )

                            )

                    )

            )

    );

所需的HTML输出为:

<pre>     
<div>Sample text sample text sample text.</div>
<div>
    <ul>
        <li>li 0 text.</li>
        <li>li 1 text.</li>
        <li>li 2 text.</li>
    </ul>
</div>
</pre>

我创建了以下函数:

   echo parseHTML($arr, '<div>');
function parseHTML($arr, $parentKey) {
    static $str = "";
    foreach ($arr as $key => $value) {
        if (is_array($value)) {
            if (is_numeric($key)) {
                parseHTML($value, $parentKey);
            } else {
                parseHTML($value, $key);
            }
        } else if (is_numeric($key)){
            $str .= '<'.$parentKey.'>'.$value .'</' . $parentKey . '>';
        } else {
            $str .= '<'.$key.'>'.$value .'</' . $key . '>';
        }
    }
    return $str;
}

我得到以下输出:

    <div>Sample text sample text sample text.</div>
<li>li 0 text.</li>
<li>li 1 text.</li>
<li>li 2 text.</li>

这与@MaggsWeb解决方案的精神相同,但无论如何我都会将其发布:)

function printHtml($key, $value) {
    if(!is_array($value) && is_numeric($key)) {
         echo $value;
    } else {        
        foreach($value as $k => $v) {
            if(is_numeric($key)) {      
               printHtml($k, $v);
            } else {
               echo "<$key>";       
               printHtml($k, $v);
               echo "</$key>";          
            }
        }
    }
}

echo '<pre>';
printHtml('p', $arr['p']);
echo '</pre>';

更新

这是一个返回字符串的版本。

function getHtml($key, $value) {
    $s = '';
    if(!is_array($value) && is_numeric($key)) {
         return  $value;
    } else {        
        foreach($value as $k => $v) {
            if(is_numeric($key)) {
               return getHtml($k, $v);
            } else {
               $s .= "<$key>".getHtml($k, $v)."</$key>";
            }
        }
    }
    return $s;
}


echo '<pre>'.getHtml('p', $arr['p']).'</pre>';

这是一个递归函数,可以处理您的数组并输出上述示例。 它应该处理相同格式的多个数组元素。

echo '<pre>';
output($arr);
echo '</pre>';

function output($array){
    foreach ($array as $key => $value){
        if(is_array($value)){
            foreach ($value as $item){
                if(is_array($item)){
                    foreach ($item as $k => $v){
                        echo "<$k>";
                        if(is_array($v)){
                            output($v);  // recursive
                        }
                        echo "</$k>";
                    }
                } else {
                    echo "<$key>$item</$key>";
                }
            }
        }
    }
}

修改后,生成并返回一个字符串。

function outputString($array,$html=''){
    foreach ($array as $key => $value){
        if(is_array($value)){
            foreach ($value as $item){
                if(is_array($item)){
                    foreach ($item as $k => $v){
                        $html .= "<$k>";
                        if(is_array($v)){
                            $html .= outputString($v,$html);
                        }
                        $html .= "</$k>";
                    }
                } else {
                    $html .= "<$key>$item</$key>";
                }
            }
        }
    }
    return $html;
}

echo outputString($arr);

我已经测试过了:

function getHTML ($arr) {

    $html="";
    foreach ($arr as $a => $b) {
        $html.="<pre><p>$b[0]</p>
            <p><ul>";

        foreach ($b[1] as $c => $d) {
            foreach ($d as $e => $f) {
                foreach ($f as $g) {
                    $html.="<li>$g</li>";
                }
            }       
        }

        $html.="</ul></p>
            </pre>";
    }

    return $html;
}

它恰好获得所需的html结构。 但这并不漂亮。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM