Преобразовать структуру массива для помощника по кодировке ul () - PullRequest
3 голосов
/ 15 августа 2011

Я хочу спросить, как преобразовать массив, как показано ниже:

$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'.

Мне нужен такой массив, чтобы я мог создать список, используя функцию ul() из помощника codeigniter.

1 Ответ

1 голос
/ 15 августа 2011

Мне пришлось сделать нечто подобное, чтобы создать дерево из строк данных.

Итак, вам нужно работать со ссылками, это проще, чем другие способы.

Следующий код приходит кчто-то похожее на то, что вы хотите (я думаю, что лучше, если вы внесете изменения позже)

<?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);

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...