Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将UL LI嵌套到PHP数组-数组中的输出不正确_Php_Arrays_Recursion_Tree_Html Lists - Fatal编程技术网

将UL LI嵌套到PHP数组-数组中的输出不正确

将UL LI嵌套到PHP数组-数组中的输出不正确,php,arrays,recursion,tree,html-lists,Php,Arrays,Recursion,Tree,Html Lists,这是我昨天问题的后续内容--我几乎成功地将HTML块转换为数组,尽管有一个小问题我无法解决。当处理下面的HTML块时,输出数组不完全符合输入的内容(我看不出哪里出了问题,需要一双新眼睛!!) 我已包括以下项目: HTML块 PHP函数与处理 输出 HTML块 基本上采取以下形式: -A -B -C ---- -D -E -F ---- -G -H -I -A -B -C -D ---- -E -F -G ---- -H

这是我昨天问题的后续内容--我几乎成功地将HTML块转换为数组,尽管有一个小问题我无法解决。当处理下面的HTML块时,输出数组不完全符合输入的内容(我看不出哪里出了问题,需要一双新眼睛!!)

我已包括以下项目:

  • HTML块
  • PHP函数与处理
  • 输出
HTML块

基本上采取以下形式:

-A
  -B
    -C
----
-D
  -E
    -F
----
-G
  -H
    -I
-A
  -B
    -C
  -D
----
  -E
    -F
  -G
----
  -H
    -I
详情如下:

<li>
    <ul>
        <li>A</li>
        <li>
            <ul>
                <li>B</li>
                <li>
                    <ul>
                        <li>C</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</li>
<li>
    <ul>
        <li>D</li>
        <li>
            <ul>
                <li>E</li>
                <li>
                    <ul>
                        <li>F</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</li>
<li>
    <ul>
        <li>G</li>
        <li>
            <ul>
                <li>H</li>
                <li>
                    <ul>
                        <li>I</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</li>
Array
(
    [0] => Array
        (
            [0] => <li>A</li>
            [1] => Array
                (
                    [0] => <li>B</li>
                    [1] => Array
                        (
                            [0] => <li>C</li>
                        )

                    [2] => <li>D</li>
                )

            [2] => Array
                (
                    [1] => <li>E</li>

                    [2] => Array
                        (
                            [1] => <li>F</li>
                        )

                    [3] => <li>G</li>
                )

            [3] => Array
                (
                    [2] => <li>H</li>
                    [3] => Array
                        (
                            [2] => <li>I</li>
                        )

                )

        )

)
详情如下:

<li>
    <ul>
        <li>A</li>
        <li>
            <ul>
                <li>B</li>
                <li>
                    <ul>
                        <li>C</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</li>
<li>
    <ul>
        <li>D</li>
        <li>
            <ul>
                <li>E</li>
                <li>
                    <ul>
                        <li>F</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</li>
<li>
    <ul>
        <li>G</li>
        <li>
            <ul>
                <li>H</li>
                <li>
                    <ul>
                        <li>I</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
</li>
Array
(
    [0] => Array
        (
            [0] => <li>A</li>
            [1] => Array
                (
                    [0] => <li>B</li>
                    [1] => Array
                        (
                            [0] => <li>C</li>
                        )

                    [2] => <li>D</li>
                )

            [2] => Array
                (
                    [1] => <li>E</li>

                    [2] => Array
                        (
                            [1] => <li>F</li>
                        )

                    [3] => <li>G</li>
                )

            [3] => Array
                (
                    [2] => <li>H</li>
                    [3] => Array
                        (
                            [2] => <li>I</li>
                        )

                )

        )

)
数组
(
[0]=>阵列
(
[0]=>
  • A
  • [1] =>阵列 ( [0]=>
  • B
  • [1] =>阵列 ( [0]=>
  • C
  • ) [2] =>
  • D
  • ) [2] =>阵列 ( [1] =>
  • E
  • [2] =>阵列 ( [1] =>
  • F
  • ) [3] =>
  • G
  • ) [3] =>阵列 ( [2] =>
  • H
  • [3] =>阵列 ( [2] =>
  • I
  • ) ) ) )

    感谢您的时间-如果您能帮助您正确输出阵列,我们将不胜感激

    下面是一个解析HTML的工作示例,使用此处提供的DOMDocument和domNodeToArray()函数将其转换为数组:

    HTML不需要格式良好

    // $inputHTML is your HTML-list as a string
    
    // this is necessary to prevent DOMDocument errors on HTML5-elements
    libxml_use_internal_errors(true);
    
    $dom = new DOMDocument();
    
    // UTF-8 hack, to correctly handle UTF-8 through DOMDocument
    $dom->loadHTML('<?xml encoding="UTF-8">' . $inputHTML);
    
    // get the first list-element in the HTML-document
    $listAsDom = $dom->getElementsByTagName('ul')->item(0);
    
    // print it out as array
    var_dump(domNodeToArray($listAsDom));
    
    
    /**
     * Transforms the contents of a DOMNode to an associative array
     * @author Marc Ermshaus
     * http://www.ermshaus.org/2010/12/php-transform-domnode-to-array
     * 
     * @param DOMNode $node DOMDocument node
     * @return mixed Associative array or string with node content
     */
    function domNodeToArray(DOMNode $node) {
        $ret = '';
    
        if ($node->hasChildNodes()) {
            if ($node->firstChild === $node->lastChild
                && $node->firstChild->nodeType === XML_TEXT_NODE
            ) {
                // Node contains nothing but a text node, return its value
                $ret = trim($node->nodeValue);
            } else {
                // Otherwise, do recursion
                $ret = array();
                foreach ($node->childNodes as $child) {
                    if ($child->nodeType !== XML_TEXT_NODE) {
                        // If there's more than one node with this node name on the
                        // current level, create an array
                        if (isset($ret[$child->nodeName])) {
                            if (!is_array($ret[$child->nodeName])
                                || !isset($ret[$child->nodeName][0])
                            ) {
                                $tmp = $ret[$child->nodeName];
                                $ret[$child->nodeName] = array();
                                $ret[$child->nodeName][] = $tmp;
                            }
    
                            $ret[$child->nodeName][] = domNodeToArray($child);
                        } else {
                            $ret[$child->nodeName] = domNodeToArray($child);
                        }
                    }
                }
            }
        }
    
        return $ret;
    }
    
    /$inputHTML是一个字符串形式的HTML列表
    //这对于防止HTML5元素上的DOMDocument错误是必要的
    libxml\u使用\u内部错误(true);
    $dom=新的DOMDocument();
    //UTF-8黑客,通过DOMDocument正确处理UTF-8
    $dom->loadHTML('.$INPUTTML);
    //获取HTML文档中的第一个列表元素
    $listAsDom=$dom->getElementsByTagName('ul')->项(0);
    //将其打印为数组
    var_dump(domNodeToArray($listAsDom));
    /**
    *将DOMNode的内容转换为关联数组
    *@作者马克·厄姆肖斯
    * http://www.ermshaus.org/2010/12/php-transform-domnode-to-array
    * 
    *@param DOMNode$node DOMDocument node
    *@return具有节点内容的混合关联数组或字符串
    */
    函数domnodetorarray(DOMNode$node){
    $ret='';
    如果($node->hasChildNodes()){
    如果($node->firstChild===$node->lastChild
    &&$node->firstChild->nodeType==XML\u TEXT\u节点
    ) {
    //节点只包含文本节点,返回其值
    $ret=修剪($node->nodeValue);
    }否则{
    //否则,执行递归
    $ret=array();
    foreach($node->childNodes作为$child){
    if($child->nodeType!==XML\u TEXT\u节点){
    //如果服务器上有多个具有此节点名称的节点
    //当前级别,创建一个数组
    如果(isset($ret[$child->nodeName])){
    如果(!是数组($ret[$child->nodeName])
    ||!isset($ret[$child->nodeName][0])
    ) {
    $tmp=$ret[$child->nodeName];
    $ret[$child->nodeName]=array();
    $ret[$child->nodeName][]=$tmp;
    }
    $ret[$child->nodeName][]=domNodeToArray($child);
    }否则{
    $ret[$child->nodeName]=domNodeToArray($child);
    }
    }
    }
    }
    }
    返回$ret;
    }
    
    如果你的列表总是格式良好,你可以用它来做你想做的事情。它使用,因此不会原谅输入代码中的错误和不良形式。如果你想原谅别人,你需要使用——代码会稍微复杂一点,但不是可笑的复杂一点

    function ul_to_array ($ul) {
      if (is_string($ul)) {
        if (!$ul = simplexml_load_string("<ul>$ul</ul>")) {
          trigger_error("Syntax error in UL/LI structure");
          return FALSE;
        }
        return ul_to_array($ul);
      } else if (is_object($ul)) {
        $output = array();
        foreach ($ul->li as $li) {
          $output[] = (isset($li->ul)) ? ul_to_array($li->ul) : (string) $li;
        }
        return $output;
      } else return FALSE;
    }
    

    如果你用a,那就容易多了。你是什么意思?HTML在我看来是有效的(我知道没有打开或关闭
      ,但如果它们在那里,它就没有开始处理它)。我这样做的原因是我可以处理
    • 项的内容-在这里我需要使用regex,除其他外…这不是最有用的评论,但我会在这里回应Gumbo。我做了一个类似的事情,我将一个HTML表解析成一个csv文件,simplexml非常出色,唯一的问题是我必须首先确保HTML格式正确,但这只是一个剥离所有属性并确保所有标记都是小写的问题。@dartacus
      只是剥离所有属性并确保所有标记都是小写的问题
      -真的吗?只是如果您能够很好地解析字符串并保证准确度,那么您就不能在同一个过程中构建您的CSV表吗?@DaveRandom您会这么想,不是吗?在我的内容作者开始制作csv或xls文件供人们直接下载之前,这是一个临时解决方案。您可以在这里看到一个示例:(在底部,“有效条目”)标准实践是在答案中实际包含有用的代码。。。为什么
      domnodetarray()
      函数中没有代码?@DaveRandom我假设它与上列出的函数相同,但也许你是对的here@feeela我尝试了一下,但只返回了前3个条目,而不是全部9@MrJ也就是说,我猜,因为您在上面的代码中使用了它。
      $dom->getElementsByTagName('ul')->项(0)
      引用第一个
      标记,在上面的示例中,该标记仅包含前三个元素。如果将字符串包装在
        中,它应该执行预期的操作。费埃拉,你应该发t
        if (!$ul = simplexml_load_string($ul)) {