【问题标题】:PHP: Convert <ul> <li> Tree HTML tag to an arrayPHP:将 <ul> <li> 树 HTML 标记转换为数组
【发布时间】:2010-05-12 08:53:56
【问题描述】:

我正在使用 jsTree,我需要将此 HTML 标记树代码 &lt;ul&gt; &lt;li&gt; 转换为 PHP 数组。 jsTree HTML 标签将被传递给 PHP 进行解析并存储在结构化的树 PHP 数组中(PHP 数组结构见下文)。

其他问题:我想要的 PHP 数组结构好还是您可以建议一个好的结构?我愿意接受建议。

提前致谢:)

干杯, 标记

jsTree 截图

HTML 树字符串

<ul class="ltr">
<li id="phtml_1" class="  open">
    <a style="" class=" " href="#"><ins>&nbsp;</ins>Folder 1</a>
    <ul>
    <li class="leaf" id="phtml_2">
        <a style="" class=" " href="#"><ins>&nbsp;</ins>Child 1.1</a>
    </li>
    <li class="open" id="phtml_3">
        <a style="" class=" " href="#"><ins>&nbsp;</ins>Folder 1.1</a>
        <ul>
        <li class="leaf last" rel="default">
            <a href="" style="" class=" "><ins>&nbsp;</ins>Child 1.1.1</a>
        </li>
        </ul>
    </li>
    <li class="last open" rel="default">
        <a href="" style="" class=" "><ins>&nbsp;</ins>Folder 1.2</a>
        <ul>
        <li class="leaf" rel="default">
            <a href="" style="" class=" "><ins>&nbsp;</ins>Child 1.2.1</a>
        </li>
        <li class="leaf last" rel="default">
            <a href="" style="" class=" "><ins>&nbsp;</ins>Child 1.2.2</a>
        </li>
        </ul>
    </li>
    </ul>
</li>
<li id="phtml_5" class="file open">
    <a style="" class=" " href="#"><ins>&nbsp;</ins>Folder 2</a>
    <ul>
    <li class="leaf" rel="default">
        <a href="" style="" class=" "><ins>&nbsp;</ins>Child 2.1</a>
    </li>
    <li class="leaf last" rel="default">
        <a href="" style="" class="clicked"><ins>&nbsp;</ins>Child 2.2</a>
    </li>
    </ul>
</li>
<li class="leaf last" rel="default">
    <a href="" style="" class=" "><ins>&nbsp;</ins>Outer Child</a>
</li>
</ul>

PHP 数组结构

<?php
$tree_array = array(
    'Folder 1' => array(
        'Child 1.1',
        'Folder 1.1' => array(
            'Child 1.1.1'
        ),
        'Folder 1.2' => array(
            'Child 1.2.1',
            'Child 1.2.2'
        ),
    ),
    'Folder 2' => array(
        'Child 2.1',
        'Child 2.2'
    ),
    'Outer Child'
);

echo '<pre>',print_r($tree_array),'</pre>';
?>

PHP print_r 输出

Array
(
    [Folder 1] => Array
        (
            [0] => Child 1.1
            [Folder 1.1] => Array
                (
                    [0] => Child 1.1.1
                )

            [Folder 1.2] => Array
                (
                    [0] => Child 1.2.1
                    [1] => Child 1.2.2
                )

        )

    [Folder 2] => Array
        (
            [0] => Child 2.1
            [1] => Child 2.2
        )

    [0] => Outer Child
)

【问题讨论】:

  • 即您从 HTML 片段开始,希望以 PHP 数组结尾?
  • @Salman:是的。我正在创建一个带有添加、编辑、删除、移动、复制、粘贴和重命名功能的按钮的 jsTree 编辑器。用户编辑后,我需要保存 HTML 标签树结构。我的问题我很难解析字符串 HTML 标记并将其保存在 PHP 数组中。

标签: php arrays jstree


【解决方案1】:

关于:

我的问题是我很难解析字符串 HTML 标记并将其保存在 PHP 数组中。

我建议您使用 HTML 解析器,例如 simplehtmldom。这将允许您以您想要的方式遍历 HTML DOM。

这是一个快速而肮脏的 UL 步行脚本:

<?php
    require_once( "simplehtmldom/simple_html_dom.php" );
    $DOM = file_get_html( "test.htm" );
    $ARR = array( );
    function WalkUL( $ul, &$ar )
    {
        foreach( $ul->children as $li )
        {
            if ( $li->tag != "li" )
            {
                continue;
            }
            $arar = array( );
            foreach( $li->children as $ulul )
            {
                if ( $ulul->tag != "ul" )
                {
                    continue;
                }
                WalkUL( $ulul, $arar );
            }
            $ar[ $li->find( "a", 0 )->plaintext ] = $arar;
        }
    }
    WalkUL( $DOM->find( "ul", 0 ), $ARR );
    print_r( $ARR );
?>

它的输出,不是你想要的,但很接近:

Array
(
    [Folder 1] => Array
        (
            [Child 1.1] => Array
                (
                )
            [Folder 1.1] => Array
                (
                    [Child 1.1.1] => Array
                        (
                        )
                )
            [Folder 1.2] => Array
                (
                    [Child 1.2.1] => Array
                        (
                        )
                    [Child 1.2.2] => Array
                        (
                        )
                )
        )
    [Folder 2] => Array
        (
            [Child 2.1] => Array
                (
                )
            [Child 2.2] => Array
                (
                )
        )
    [Outer Child] => Array
        (
        )
)

【讨论】:

  • 谢谢萨尔曼。当我阅读您的答案时,我目前正在测试我在 phpclasses.org 中下载的 simplehtmldom。感谢您的 WalkUL 功能,它会有所帮助:) 干杯
  • 我只需要编辑 PHP 数组结构来满足我的需要。再次感谢:>
  • 数组结构中唯一的问题是,如果有多个相同的文件夹名称,那么它将覆盖数组键。但我会想办法把它放在值而不是键中。
  • 复杂但可能。您的“子数组”可以是关联数组:array( "label" =&gt; "Folder 1", "children" =&gt; array( ) );。变得棘手!
【解决方案2】:

您应该以对程序员更友好的格式提交树数据,而不是乱用 html。

$('#saveButton').click(function() {
    var treeData = $.tree.reference($('#sortableTree')).get(undefined, 'json');
    var tmp = serializeTree(treeData, 0);
    // now json-encode tmp and submit it
});

function serializeTree(nodes, parent)
{
    var parents = {};
    var childOrder = []
    var childOrders = {};
    for(var i = 0; i < nodes.length; i++)
    {
        var node = nodes[i];
        var id = node.attributes.id.substr(5); // assuming the id looks like 'abcd-ID'
        parents[id] = parent;
        childOrder.push(id);
        if(node.children)
        {
            var tmp = serializeTree(node.children, id);
            for(var id in tmp[0])
                parents[id] = tmp[0][id];
            for(var id in tmp[1])
                childOrders[id] = tmp[1][id]
        }
    }

    childOrders[parent] = childOrder;

    return [parents, childOrders];
}

【讨论】:

  • 不错! :) 快速回复。你是好先生。我现在就试试。谢谢! :D
  • Um I javascript alert tmp 这是输出:[{_1:0, _2:"_1", _3:"_1", _5:0}, {_1:["_2", "_3"], 0:["_1", "_5"]}] 我不明白?嗯...你能详细说明一下吗?再次感谢:)
【解决方案3】:

仅供参考:还有一个用于序列化

    列表的嵌套结构转换为可用作关联 php 数组的字符串。

【讨论】:

    【解决方案4】:

    如果您的 UL 不包含任何 href 元素(例如,只是纯文本 nexted ul).. 我已经调整了 Salman 的 simplehtmldom 代码以使用它:

    $DOM = str_get_html( $catshtml );
    $ARR = array( );
    function WalkUL( $ul, &$ar )
    {
        foreach( $ul->children as $li )
        {
            if ( $li->tag != "li" )
            {
                continue;
            }
            $arar = array( );
            foreach( $li->children as $ulul )
            {
                if ( $ulul->tag != "ul" )
                {
                    continue;
                }
                WalkUL( $ulul, $arar );
            }
            $ar[ trim(preg_replace("#</?[a-z]+[^>]*>(.+</[a-z]+[^>]*>|)#is","",$li->innertext)) ] = $arar;
        }
    }
    WalkUL( $DOM->find( "ul", 0 ), $ARR );
    echo "<pre>"; print_r( $ARR );
    

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 2023-04-02
      • 2012-09-08
      • 2013-01-27
      • 2018-11-30
      • 2014-05-14
      • 2019-05-28
      • 2017-03-26
      • 2023-02-08
      相关资源
      最近更新 更多