2013-10-15 1 views
0

Я пытаюсь извлечь многомерный массив, который я получил от Nestable Plugin, в Ordered List структурой плагина HTML.извлечение многомерного массива во вложенный список

Рекурсия, которую я построил, недостаточна, потому что тег 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> 

Это пример из 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> 

ответ

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/