具有到HTML树级别的PHP数组

时间:2018-07-05 03:34:43

标签: php html algorithm

我在php中有一个看起来像这样的数组:

array[x][0]=item name
array[x][1]=level

例如

array[0][0]="Node 1"
array[0][1]=0
array[1][0]="Node 2"
array[1][1]=0
array[2][0]="Node 2.1"
array[2][1]=1
array[3][0]="Node 2.1.1"
array[3][1]=2
array[4][0]="Node 2.2"
array[4][1]=1

我需要将其转换为html ul列表,但看起来像这样:

<ul>
    <li>
        <input type="checkbox" /><span>Node 1</span>
    </li>
    <li>
        <input type="checkbox" /><span>Node 2</span>
        <ul>
            <li>
                <input type="checkbox" /><span>Node 2.1</span>
                <ul>
                    <li><input type="checkbox"><span>Node 2.1.1</span></li>
                </ul>
            </li>
            <li>
                <input type="checkbox" /><span>Node 2.2</span>
            </li>
        </ul>
    </li>
</ul>

最大的收获是</li>标签的位置-它必须在下一个<ul>标签之后。因此,它是<li>个当前节点<ul><li>子节点</li></ul></li>。是最后一个</li>吸引了我。

此格式对于使用我正在使用的{https://github.com/daredevel/jquery-tree)jQuery插件是必需的。

我在这里看到了建议:create html list from array with levels,但是由于额外的

  • 而无法解决。

    我认为使用递归和数组切片可以解决此问题,但这似乎效率很低。到目前为止,我尝试迭代解决方案的尝试都失败了……

  • 2 个答案:

    答案 0 :(得分:1)

    您可以使用此函数将数组转换为嵌套的HTML列表(echo nestedHtmlList($array);

    function nestedHtmlList($array) {
        $depth = 0;
        $result = "";
        foreach ($array as $node) {
            $newDepth = $node[1];
    
            if ($newDepth > $depth) {
                $result .= "<ul><li>";
            } else if ($newDepth < $depth) {
                for ($d = $newDepth; $d < $depth; $d++) {
                    $result .= "</li></ul>";
                }
                $result .= "</li><li>";
            } else if ($result == "") {
                $result .= "<ul><li>";
            } else {
                $result .= "</li><li>";
            }
            $result .= "<input type='checkbox' /><span>";
            $result .= $node[0];
            $result .= "</span>";
    
            $depth = $newDepth;
        }
    
        while ($depth > 0) {
            $result .= "</li></ul>";
            $depth -= 1;
        }
    
        return $result;
    }
    

    答案 1 :(得分:0)

    告诉我您的想法:

    代码

    $array = [];
    $array[0][0]="Node 1";
    $array[0][1]=0;
    $array[1][0]="Node 2";
    $array[1][1]=0;
    $array[2][0]="Node 2.1";
    $array[2][1]=1;
    $array[3][0]="Node 2.1.1";
    $array[3][1]=2;
    $array[4][0]="Node 2.2";
    $array[4][1]=1;
    
    function makeList( &$array, $level = null ) {
        $html = '<ul>';
        $html .= '<li>Level: ' . $level;
        while( $element = array_shift( $array ) ) {
            if( $level == $element[1] ) {
                $html .= '</li><li><label><input type="checkbox"/> ' . $element[0] . '</label>';
            } else if( $level < $element[1] ) {
                array_unshift( $array, $element );
                $html .= makeList( $array, $element[1] ) . '</li>';
            } else {
                array_unshift( $array, $element );
                break;
            }
        }
        $html .= '</ul>';
    
        return $html;
    }
    
    echo '<pre>';
    echo makeList($array);
    

    输出(人工呈现的html:D)

    Level: 
    [] Node 1
    [] Node 2
    Level: 1
        [] Node 2.1
        Level: 2
            [] Node 2.1.1
        [] Node 2.2