【问题标题】:extract multidimentional array into a nested list将多维数组提取到嵌套列表中
【发布时间】:2013-10-15 09:18:20
【问题描述】:

我正在尝试通过插件的HTML 结构将我从Nestable Plugin 获得的多维数组提取到Ordered List

我建立的递归是不够的,因为我正在创建的OL 标记在有孩子的LI 之外。乍一看,这似乎是一项简单的任务,但我没有完成它。

这是我到目前为止所写的,我不明白如何检查递归中的下一个循环是否是有孩子的LI,所以OL 将是里面,有按钮和把手div
(插件的HTML结构示例如下)

function buildNestedList($a) {

    if (!is_array($a)) {
        echo ('<li class="dd-item" data-name="'.$a.'"><div class="dd-handle">'.$a.'</div></li>');
        return;
    }

    foreach($a as $k => $v) {
        if(($k=="children")&&(is_string($k))) {
            echo ('<ol class="dd-list">');
        buildNestedList($v);
            echo ("</ol></li>");
        }
        else {
            printAll($v);
        }
    }
}

这是我的函数的输出:

<div class="dd" id="nestable">
   <ol class="dd-list">
      <li class="dd-item" data-name="item 1">
         <div class="dd-handle">item 1</div>
      </li>
      <li class="dd-item" data-name="item 2">
         <div class="dd-handle">item 2</div>
      </li>
      <li class="dd-item" data-name="item 3">
         <div class="dd-handle">item 3</div>
      </li>
      <ol class="dd-list">
         <li class="dd-item" data-name="item 4">
            <div class="dd-handle">item 4</div>
         </li>
         <li class="dd-item" data-name="item 5">
            <div class="dd-handle">item 5</div>
         </li>
         <li class="dd-item" data-name="item 6">
            <div class="dd-handle">item 6</div>
         </li>
         <ol class="dd-list">
            <li class="dd-item" data-name="item 7">
               <div class="dd-handle">item 7</div>
            </li>
            <li class="dd-item" data-name="item 8">
               <div class="dd-handle">item 8</div>
            </li>
         </ol>
      </ol>
      <li class="dd-item" data-name="item 9">
         <div class="dd-handle">item 9</div>
      </li>
      <li class="dd-item" data-name="item 10">
         <div class="dd-handle">item 10</div>
      </li>
      <li class="dd-item" data-name="item 11">
         <div class="dd-handle">item 11</div>
      </li>
   </ol>
</div>

这是我从 DB 获得的 Array 示例:

Array
(
    [0] => Array
        (
            [name] => item 1
        )

    [1] => Array
        (
            [name] => item 2
        )

    [2] => Array
        (
            [name] => item 3
            [children] => Array
                (
                    [0] => Array
                        (
                            [name] => item 4
                        )

                    [1] => Array
                        (
                            [name] => item 5
                        )

                    [2] => Array
                        (
                            [name] => item 6
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [name] => item 7
                                        )

                                    [1] => Array
                                        (
                                            [name] => item 8
                                        )

                                )

                        )

                )

        )

    [3] => Array
        (
            [name] => item 9
        )

    [4] => Array
        (
            [name] => item 10
        )

    [5] => Array
        (
            [name] => item 11
        )

)

这是正确插件的HTML 结构示例:

<ol class="dd-list">
   <li class="dd-item" data-name="item 1">
      <div class="dd-handle">item 1</div>
   </li>
   <li class="dd-item" data-name="item 2">
      <button data-action="collapse" type="button">Collapse</button><button data-action="expand" type="button" style="display: none;">Expand</button>
      <div class="dd-handle">item 2</div>
      <ol class="dd-list">
         <li class="dd-item" data-name="item 3">
            <div class="dd-handle">item 3</div>
         </li>
         <li class="dd-item" data-name="item 4">
            <div class="dd-handle">item 4</div>
         </li>
         <li class="dd-item" data-name="item 5">
            <div class="dd-handle">item 5</div>
         </li>
      </ol>
   </li>
   <li class="dd-item" data-name="item 6">
      <button data-action="collapse" type="button">Collapse</button><button data-action="expand" type="button" style="display: none;">Expand</button>
      <div class="dd-handle">item 6</div>
      <ol class="dd-list">
         <li class="dd-item" data-name="item 7">
            <button data-action="collapse" type="button">Collapse</button><button data-action="expand" type="button" style="display: none;">Expand</button>
            <div class="dd-handle">item 7</div>
            <ol class="dd-list">
               <li class="dd-item" data-name="item 8">
                  <div class="dd-handle">item 8</div>
               </li>
            </ol>
         </li>
      </ol>
   </li>
</ol>

【问题讨论】:

    标签: php arrays recursion multidimensional-array nested-lists


    【解决方案1】:

    你必须正确地打开和关闭标签。

    使用这个:

    $source=json_decode('[{"name":"item 1"},{"name":"item 2"},{"name":"item 3","children":[{"name":"item 4"},{"name":"item 5"},{"name":"item 6","children":[{"name":"item 7"},{"name":"item 8"}]}]},{"name":"item 9"},{"name":"item 10"},{"name":"item 11"}]',true);
    
    function buildNestedList(array $a)
    {
        if(empty($a["name"]))
        {
            echo "<ol>";
            foreach($a as $item)
            {
                buildNestedList($item);
            }
            echo "</ol>";
        }
        else
        {
            echo "<li><div>".$a["name"]."</div>";
            if(!empty($a["children"]))
            {
                buildNestedList($a["children"]);
            }
            echo "</li>";
        }
    }
    buildNestedList($source);
    

    PHP Live demo

    请注意,我在上面的现场演示中进行了一些漂亮的打印。

    这是生成的嵌套列表的简单示例:http://jsfiddle.net/YDnd8/

    【讨论】:

      猜你喜欢
      • 2010-09-26
      • 2022-01-09
      • 2016-09-28
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多