Рекурсивный многомерный массив UL LI to PHP

Я пытаюсь преобразовать блок HTML, который в основном в следующем виде (каждый элемент списка должен быть в одной строке, поэтому не должно быть строк, содержащих <ul><li> если вы понимаете, что я имею в виду):

 <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"; 

Solutions Collecting From Web of "Рекурсивный многомерный массив UL LI to PHP"

Это ответ, если кто-нибудь встретит это позже …

 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; } } 

Самый простой способ выполнить это с помощью рекурсивной функции, например:

 //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"; } 

Передайте свой массив этой функции, чтобы она выводилась так, как вы хотите.

Надеюсь, это поможет!

С уважением, Фил,