转换ul()codeigniter helper的数组结构

时间:2011-08-15 08:34:27

标签: php codeigniter

我想问一下如何转换如下的数组:

$arr = array(
    array(
        'id' => 1,
        'name' => 'Home',
        'link_to' => 'home.php',
        'parent' => 0,
        'level' => 1
    ),
    array(
        'id' => 2,
        'name' => 'About',
        'link_to' => 'about.php',
        'parent' => 0,
        'level' => 1
    ),
    array(
        'id' => 3,
        'name' => 'About Me',
        'link_to' => 'about-me.php',
        'parent' => 2,
        'level' => 2
    ),
    array(
        'id' => 4,
        'name' => 'About Us',
        'link_to' => 'about-us.php',
        'parent' => 2,
        'level' => 2
    ),
    array(
        'id' => 5,
        'name' => 'Contact Us',
        'link_to' => 'contact-us.php',
        'parent' => 4,
        'level' => 3
    ),
    array(
        'id' => 6,
        'name' => 'Blog',
        'link_to' => 'blog.php',
        'parent' => 0,
        'level' => 1
    ),
);

进入这一个:

$result = array(
    'Home',
    'About' => array(
        'About Me',
        'About Us' => array(
            'Contact Us'
        )
    ),
    'Blog'
);

有元素'parent'id可以告诉父数组(0 = root),还有元素'level'。

我需要那种数组,所以我可以使用codeigniter helper中的ul()函数创建列表。

1 个答案:

答案 0 :(得分:1)

我必须做类似的事情来从数据行创建一个树。

所以,你必须使用引用,它比其他方法更容易。

接下来的代码会出现类似于你想要的东西(我认为如果你以后做出更改会有更好的结构)

<?php

    $arr = array(
        array(
            'id' => 1,
            'name' => 'Home',
            'link_to' => 'home.php',
            'parent' => 0,
            'level' => 1
        ),
        array(
            'id' => 2,
            'name' => 'About',
            'link_to' => 'about.php',
            'parent' => 0,
            'level' => 1
        ),
        array(
            'id' => 3,
            'name' => 'About Me',
            'link_to' => 'about-me.php',
            'parent' => 2,
            'level' => 2
        ),
        array(
            'id' => 4,
            'name' => 'About Us',
            'link_to' => 'about-us.php',
            'parent' => 2,
            'level' => 2
        ),
        array(
            'id' => 5,
            'name' => 'Contact Us',
            'link_to' => 'contact-us.php',
            'parent' => 4,
            'level' => 3
        ),
        array(
            'id' => 6,
            'name' => 'Blog',
            'link_to' => 'blog.php',
            'parent' => 0,
            'level' => 1
        ),
    );


    $refs = array();

    foreach($arr as &$item) {
        $item['children'] = array();
        $refs[$item['id']] = $item;
    }

    unset($item); // To delete the reference

    // We define a ROOT that is the top of each elements
    $refs[0] = array(
        'id' => 0,
        'children' => array()
    );

    foreach($arr as $item) {
        if($item['id'] > 0) {
            $refs[$item['parent']]['children'][] = &$refs[$item['id']];
        }
    }

    $result = $refs[0];

    unset($refs); // To delete references

    var_dump($result);

?>