3

誰?

事前に感謝します。追加情報が必要な場合はお知らせください。

多次元配列を複数のネストされた HTML ナビゲーション メニューに変換しようとしています。SO: solution hereに関する別の回答から、その要点を理解しました。

私が理解しようとしているのは、次の子配列の URL で最上位の親リンク (および後続の子ページ リンク) を保持する方法です。配列を構築するために関数自体を呼び出すときに関数へのリンクを渡そうとしましたが、それは最新の親リンクのみを保持していました。

例:

ホーム 概要
-情報 --
サブページ

になります:

ホームについて/情報について/情報/サブページについて

サンプル配列は次のとおりです。

Array
(
[0] => stdClass Object
    (
        [id] => 12
        [parent] => 11
        [name] => Sub Page
        [link] => sub_page
        [target] => _self
    )

[1] => stdClass Object
    (
        [id] => 14
        [parent] => 12
        [name] => Test
        [link] => test_test
        [target] => _self
    )

[2] => stdClass Object
    (
        [id] => 9
        [parent] => 0
        [name] => Home
        [link] => home
        [target] => _self
    )

[3] => stdClass Object
    (
        [id] => 11
        [parent] => 10
        [name] => Info
        [link] => info
        [target] => _self
    )

[4] => stdClass Object
    (
        [id] => 13
        [parent] => 10
        [name] => Test
        [link] => test
        [target] => _self
    )

[5] => stdClass Object
    (
        [id] => 10
        [parent] => 0
        [name] => About
        [link] => about
        [target] => _self
    )

)

そして、ここに私が使用しているコードがあります:

function create_menu_array($arr, $parent = 0){
    $pages = array();
    foreach($arr as $page){
        if($page->parent == $parent){               
            $page->sub = isset($page->sub) ? $page->sub : $this->create_menu_array($arr, $page->id);
            $pages[] = $page;
        }
    }
    return $pages;
}

function create_menu_html($nav){
    $html = '';
    foreach($nav as $page){
        $html .= '<ul><li>';
        $html .= '<a href="' . base_url().$page->link . '" target="'.$page->target.'">' . $page->name . '</a>';
        $html .= $this->create_menu_html($page->sub);
        $html .= '</li></ul>';
    }
    return $html;
}
4

1 に答える 1

0

再帰関数を使用したソリューション:

例: http://phpfiddle.org/main/code/pmw-7i3

<?php

function array_process_for_ids($items) {
    $new_array = array();
    foreach ($items as $item) {
        $new_array[$item['id']] = $item;
    }
    return $new_array;
}

function menu($items) {
    function menu_recursive($parent_item) {
        global $items;
        unset($items[$parent_item['id']]);
        echo '<div style="padding-left: 15px;">';
        echo '- '.$parent_item['name'];
        foreach ($items as $item) {
            if ($item['parent'] == $parent_item['id']) {
                menu_recursive($item);
            }
        }
        echo  '</div>';
    }
    foreach ($items as $item) {
        if ($item['parent'] == 0) menu_recursive($item);
    }
}

$items = array(
    array(
        'id' => 10,
        'parent' => 0,
        'name' => 'Top Page 1',
        'link' => 'top_page_1',
        'target' => '_self'
    ),
    array(
        'id' => 12,
        'parent' => 0,
        'name' => 'Top Page 2',
        'link' => 'top_page_2',
        'target' => '_self'
    ),
    array(
        'id' => 25,
        'parent' => 10,
        'name' => 'Sub Page 1 of top page 1',
        'link' => 'sub_page_1_of_top_page_1',
        'target' => '_self'
    ),
    array(
        'id' => 26,
        'parent' => 12,
        'name' => 'Sub Page 1 of top page 2',
        'link' => 'sub_page_1_of_top_page_2',
        'target' => '_self'
    ),
    array(
        'id' => 28,
        'parent' => 26,
        'name' => 'Sub Page of sub page 1 of top page 2',
        'link' => 'sub_page_of_sub_page_1_of_top_page_2',
        'target' => '_self'
    )
);

$items = array_process_for_ids($items);

menu($items);

?>
于 2013-02-21T05:37:26.330 に答える