代码之家  ›  专栏  ›  技术社区  ›  jgalak

具有HTML树级别的PHP数组

  •  -2
  • jgalak  · 技术社区  · 6 年前

    我在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> 这让我很兴奋。

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

    我看到这里的建议: create html list from array with levels 但那不起作用,因为额外的

  • .

    我认为有一个使用递归和数组切片的解决方案,但是这看起来效率很低。到目前为止,我尝试迭代解决方案失败了…

  • 2 回复  |  直到 6 年前
        1
  •  1
  •   Leo Aso    6 年前

    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;
    }
    
        2
  •  0
  •   SirPilan    6 年前

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

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