将数组转换为UL LI

时间:2012-01-30 18:37:46

标签: php arrays recursion tree html-lists

我不能为我的生活将我的数组转换为嵌套的UL LI树,我一整天都在尝试它但是必须有一些我无法发现的缺陷(可能是因为我的数组不是很简单的一个)。

基本上,数组采用以下形式:

$array = array(
  "0" => array(
    "0" => array("letter" => "A", "data" => "123"), 
    "1" => array(
      "0" => array(
        "0" => array("letter" => "B", "data" => "123"), 
        "1" => array(
          "0" => array(
            "0" => array("letter" => "C", "data" => "123")
          )
        )
      ), 
      "1" => array(
        "0" => array("letter" => "D", "data" => "123"), 
        "1" => array(
          "0" => array(
            "0" => array("letter" => "E", "data" => "123")
          )
        )
      )
    )
  )
);

解释上面的数组

数组成对出现 - 第一个数字是组,第二个数字是行。上面有3列(或我称之为的级别),只有一个'组'。

所以[0][0]将是第0组,第一行,[0][1][0][0]将是第一行的第二行,但是第2行的第一行,因此是第1行。

基本上我希望结果显示如下(对于上面的例子):

<ul id="mylist">
    <li>
        <ul class="initial">
            <li>A</li>
            <li class="top">
                <ul class="wrap">
                    <li>
                        <ul class="inner">
                            <li>B</li>
                            <li class="top">
                                <ul class="wrap">
                                    <li>
                                        <ul class="inner">
                                            <li>C</li>
                                        </ul>
                                    </li>
                                    <li class="end"><a class="add">Add</a></li>
                                </ul>
                            </li>
                        </ul>
                    </li>
                    <li>
                        <ul class="inner">
                            <li>D</li>
                            <li class="top">
                                <ul class="wrap">
                                    <li>
                                        <ul class="inner">
                                            <li>E</li>
                                        </ul>
                                    </li>
                                    <li class="end"><a class="add">Add</a></li>
                                </ul>
                            </li>
                        </ul>
                    </li>
                    <li class="end"><a class="add">Add</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li class="end"><a class="add">Add</a></li>
</ul>

基本上,每个节点分支的末尾都会出现一个'add'('wrap'类中的最后一个列表项。)

到目前为止,我已完成以下操作,但我觉得它根本不正确,如果添加了其他节点或删除了节点,则无法正常工作。

function recursion($data, $level){

    $skip = array_key_exists('data', $data[0]) ? 0 : 1;

    if($skip == 0){
        $level++;
        if($level !== 1){
            $out .= "<li>\n";
        }
        if($level == 1){
            $out .= "<ul class='initial'>\n";
        } else {
            $out .= "<ul class='inner'>\n";
        }
    }
    $count = 0;
    $loop_count = 0;
    $show_end = 0;
    foreach($data as $key => $value){
        $loop_count++;
        if(is_array($value) && array_key_exists('data', $value)){
            $count++;

            $out .= ($skip == 0) ? "<li>" : "";

            if($value['data'] == "123"){
                $out .= $value['letter'];
            }

            if(!is_array($data[($key+1)][0])){
                $out .= "</li>\n";
                $out .= "<li class=\"end\"><a class=\"add\">Add</a></li>\n";

                $out .= "</ul>\n";
                $out .= "</li>\n";
                $out .= "</ul>\n";
                $out .= "</li>\n";

                $out .= "<li class=\"end\"><a class=\"add\">Add</a></li>\n";

                $show_end = 1;
            }
            $last_key = $key;
        } else if(is_array($value)){
            $out.= recursion($value, $level);
        }
        if($show_end == 1){
            $out .= "</ul>\n";
        }
        if(is_array($value) && array_key_exists('data', $value) && !is_array($data[($key+1)])){
            $out .= "</li>\n";
        }
        if($show_end == 1 && count($data) !== $count){
            $out .= "<li>\n";
        }
    }

    return $out;
}

输出

 print_r($array, true) 

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [letter] => A
                    [data] => 123
                )

            [1] => Array
                (
                    [0] => Array
                        (
                            [0] => Array
                                (
                                    [0] => Array
                                        (
                                            [letter] => B
                                            [data] => 123
                                        )

                                    [1] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [letter] => C
                                                            [data] => 123
                                                        )

                                                )

                                        )

                                )

                            [1] => Array
                                (
                                    [0] => Array
                                        (
                                            [letter] => D
                                            [data] => 123
                                        )

                                    [1] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [letter] => E
                                                            [data] => 123
                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

1 个答案:

答案 0 :(得分:1)

您确定您的数组结构与您显示的HTML相匹配吗?我调整了数组,并提出了似乎有用的功能。

function build_list($array, $level=0)
{
    foreach($array as $group)
    {
        echo '<li>';
        if(isset($group['letter']))
        {
            echo $group['letter'];
        }
        else            
        {
            $class = 'wrap';
            if($level%2 == 1)
            {
                $class = 'inner';
            }
            echo '<ul class="' . $class . '">';
            build_list($group, $level+1);
            if($class == 'wrap')
            {
                echo '<li class="end"><a class="add">Add</a></li>';
            }
            echo '</ul>';
        }
        echo '</li>';
    }
}

以下是对数组的更改:

$array = 
array
(
    array("letter" => "A", "data" => "123"), //li
    array //li ul
    (
        array //li ul
        (
            array("letter" => "B", "data" => "123"), //li
            array //li ul
            (
                array //li ul
                (
                    array("letter" => "C", "data" => "123")
                )
            )
        ),
        array
        (
            array("letter" => "D", "data" => "123"), 
            array
            (
                array
                (
                    array("letter" => "E", "data" => "123")
                )
            )
        )
    )
);

然后调用它:

<ul class="inital">
<?php
build_list($array);
?>
</ul>