2012-01-26 149 views
1

我試圖轉換一個基本上是以下形式的HTML塊(每個列表項應該在一行上,所以如果你有任何行應該不包含<ul><li>看看我的意思):遞歸UL LI到PHP多維數組

<ul> 
<li>Item 1</li> 
<li> 
<ul> 
<li>Item 2</li> 
<li>Item 3</li> 
</ul> 
</li> 
<li>Item 4</li> 
</ul> 

但它可能是幾層深。我基本上想要將它轉換爲一個多維數組,其中的內容是值(實際的內容有點更詳細,但我應該能夠處理這些細節)。當輸出數組是非常像的下面:

$array[0]['value'] = "item 1"; 
$array[1][0]['value'] = "item 2"; 
$array[1][1]['value'] = "item 3"; 
$array[2]['value'] = "item 4"; 
+1

你願意使用一個外部庫,如PHP簡單的HTML DOM解析器(HTTP ://simplehtmldom.sourceforge.net/)?它會讓你的生活變得非常簡單。 – xbonez

+0

請參閱[如何使用PHP解析和處理HTML](http://stackoverflow.com/questions/3577641/how-to-parse-and-process-html-with-php) – Gordon

+2

@xbonez SimpleHTMLDOM很臭。 – Gordon

回答

2

這就是答案,如果任何人遇到這種後...

function ul_to_array($ul){ 
     if(is_string($ul)){ 
      if(!$ul = simplexml_load_string($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){ 
       $update_with = (isset($li->ul)) ? ul_to_array($li->ul) : (($li->count()) ? $li->children()->asXML() : (string) $li); 
       if(is_string($update_with)){ 
        if(trim($update_with) !== "" && $update_with !== null){ 
         $output[] = $update_with; 
        } 
       } else { 
         $output[] = $update_with; 
       } 
      } 
      return $output; 
     } else { 
      return FALSE; 
     } 
    } 
+0

你的美麗,謝謝MrJ! –

-1

,最簡單的方式來完成,這是一個遞歸函數,就像這樣:

//output a multi-dimensional array as a nested UL 
function toUL($array){ 
    //start the UL 
    echo "<ul>\n"; 
     //loop through the array 
    foreach($array as $key => $member){ 
     //check for value member 
     if(isset($member['value'])){ 
      //if value is present, echo it in an li 
      echo "<li>{$member['value']}</li>\n"; 
     } 
     else if(is_array($member)){ 
      //if the member is another array, start a fresh li 
      echo "<li>\n"; 
      //and pass the member back to this function to start a new ul 
      toUL($member); 
      //then close the li 
      echo "</li>\n"; 
     } 
    } 
    //finally close the ul 
    echo "</ul>\n"; 
} 

通過你的陣列,其功能是有它的輸出你想要的方式。

希望有幫助!

問候, 菲爾,

+2

你誤讀了帖子 - 應該對PHP陣列做相反的無序列表 – MrJ