Рекурсивный UL LI в PHP многомерный массив - PullRequest
1 голос
/ 26 января 2012

Я пытаюсь преобразовать блок 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";

Ответы [ 2 ]

2 голосов
/ 11 февраля 2012

Это ответ, если кто-нибудь сталкивается с этим позже ...

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 голосов
/ 26 января 2012

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

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

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

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

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

...