递归数据输出

时间:2014-04-11 10:35:39

标签: php

$dirs = array(
    'root_dir' => array(
        'sub_dir_1' => array(
            0 => 'file'
        ),
        'sub_dir_2' => array(
            0 => 'file'
        ),
        'sub_dir_3' => array(
            0 => 'file_1',
            1 => 'file_2',
            2 => 'file_3'
        )
    ),
);


$render = function($dirs) use (&$render) {
    echo "<ul>";
    foreach ($dirs as $parent => $children) {
        if (is_string($parent) === true) {
            echo "<li>$parent</li>";
            $render($children);
        }  else {
            echo "<li>$children</li>";           
        }
    }
    echo "</ul>";
};

$render($dirs);

输出

<ul>
    <li>root_dir</li>
    <ul>
        <li>sub_dir_1</li>
        <ul>
            <li>file</li>
        </ul>
        <li>sub_dir_2</li>
        <ul>
            <li>file</li>
        </ul>
        <li>sub_dir_3</li>
        <ul>
            <li>file_1</li>
            <li>file_2</li>
            <li>file_3</li>
        </ul>
    </ul>
</ul>

需要的输出

<ul>
    <li>
        root_dir
        <ul>
            <li>
                sub_dir_1
                <ul>
                    <li>file</li>
                </ul>
            </li>
            <li>
                sub_dir_2
                <ul>
                    <li>file</li>
                </ul>
            </li>
            <li>
                sub_dir_3
                <ul>
                    <li>file_1</li>
                    <li>file_2</li>
                    <li>file_3</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

我做错了什么?

2 个答案:

答案 0 :(得分:6)

        echo "<li>$parent</li>";
        $render($children);

应该是:

        echo "<li>".$parent;
        $render($children);
        echo "</li>";

否则您的孩子不在父<li>之内。

答案 1 :(得分:0)

<@> @Niet发现了这个错误,但我会采用一种稍微不同的方式:

$render = function($dirs) use (&$render) {    
    foreach ($dirs as $parent => $children) {
        $s .= "<li>" . (is_string($parent) ? $parent . $render($children) : $children) . "</li>";       
    }
    return "<ul>$s</ul>";
};

echo $render($dirs);
  • is_string会返回truefalse,因此无需进行===比较。
  • 而不是echo遍布整个地方,我选择一次性构建字符串,最后echo。这允许$render($children)的输出在foreach循环
  • 中连接
  • 您的最终</li>声明中有一个备用的echo - 我将其删除了。

希望它对你有用。