从嵌套数组生成HTML的递归

时间:2015-09-03 07:12:37

标签: php html arrays recursion

我有以下数组。我需要创建一个从这种类型的数组构建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>

3 个答案:

答案 0 :(得分:3)

这与@ 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>';

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我测试了这个:

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结构。但它并不漂亮。