2014-04-11 95 views
1
$dirs = array(
    'root_dir' => array(
     'sub_dir_1' => array(
      0 => 'file' 
     ), 
     'sub_dir_2' => array(
      0 => 'file' 
     ), 
     'sub_dir_3' => array(
      0 => 'file_1', 
      1 => 'file_2', 
      2 => 'file_3' 
     ) 
    ), 
); 


$render = function($dirs) use (&$render) { 
    echo "<ul>"; 
    foreach ($dirs as $parent => $children) { 
     if (is_string($parent) === true) { 
      echo "<li>$parent</li>"; 
      $render($children); 
     } else { 
      echo "<li>$children</li>";   
     } 
    } 
    echo "</ul>"; 
}; 

$render($dirs); 

輸出遞歸數據輸出

<ul> 
    <li>root_dir</li> 
    <ul> 
     <li>sub_dir_1</li> 
     <ul> 
      <li>file</li> 
     </ul> 
     <li>sub_dir_2</li> 
     <ul> 
      <li>file</li> 
     </ul> 
     <li>sub_dir_3</li> 
     <ul> 
      <li>file_1</li> 
      <li>file_2</li> 
      <li>file_3</li> 
     </ul> 
    </ul> 
</ul> 

所需輸出

<ul> 
    <li> 
     root_dir 
     <ul> 
      <li> 
       sub_dir_1 
       <ul> 
        <li>file</li> 
       </ul> 
      </li> 
      <li> 
       sub_dir_2 
       <ul> 
        <li>file</li> 
       </ul> 
      </li> 
      <li> 
       sub_dir_3 
       <ul> 
        <li>file_1</li> 
        <li>file_2</li> 
        <li>file_3</li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 

我做錯了嗎?

回答

6
 echo "<li>$parent</li>"; 
     $render($children); 

應該是:

 echo "<li>".$parent; 
     $render($children); 
     echo "</li>"; 

否則,你的孩子是父母<li>之外。

0

@Niet發現了錯誤,但我會去這一個稍微不同的方式:

$render = function($dirs) use (&$render) {  
    foreach ($dirs as $parent => $children) { 
     $s .= "<li>" . (is_string($parent) ? $parent . $render($children) : $children) . "</li>";  
    } 
    return "<ul>$s</ul>"; 
}; 

echo $render($dirs); 
  • is_string回報truefalse,因此無需爲===比較。
  • 而不是echo在所有的地方,我選擇一次性建立所有的字符串,並在最後加入echo。這允許$render($children)的輸出連接在foreach循環內
  • 您在最終echo聲明中有一個備用</li> - 我將其刪除。

希望它對您有些用處。