0

100 を超える要素のメニューを保持し、それを CSS ドロップダウン メニューとして出力する配列があります。5 つのメイン メニューがあり、これらにはサブメニューがあり、これらの一部にはサブメニューなどがあります。現在、印刷時にループをハードコーディングしていますが、何か賢い方法があるに違いないと確信しています。わずか数行のコードで!配列の先頭は次のようになります。

$menu = array(
    array(
        'title' => 'Travel tips',
        'url' => 'travel-tips',
        'sub' => array(
            array(
                'title' => 'Travel guide',
                'url' => 'travel-guide'),
            array(
                'title' => 'Places to visit',
                'url' => 'places-to-visit',
                'sub' => array(
                    array(
                        'title' => 'Ahu Akivi',
                        'url' => 'ahu-akivi'),
                    array(
                        'title' => 'Ahu Tongariki',
                        'url' => 'ahu-tongariki'),
                    array(
                        'title' => 'Anakena',
                        'url' => 'anakena'),
                    array(
                        'title' => 'Orongo',
                        'url' => 'orongo'),
                    array(
                        'title' => 'Rano Kau',
                        'url' => 'rano-kau'),
                    array(
                        'title' => 'Rano Raraku',
                        'url' => 'rano-raraku'),
                    array(
                        'title' => 'Vinapu',
                        'url' => 'vinapu'))),
            array(
                'title' => 'Things to do',
                'url' => 'things-to-do',
                'sub' => array(
                    array(
                        'title' => 'Beaches',
                        'url' => 'beaches'),
                    array(
                        'title' => 'Church',
                        'url' => 'church'),
                    array(
                        'title' => 'Fishing',
                        'url' => 'fishing'),

…そして、延々と続く。ループをハードコーディングせずに、わずか数行のコードで再帰的にこれをきちんときれいにループするにはどうすればよいですか?

4

4 に答える 4

2

ループ回数を指定したくない場合は、自己呼び出し関数が必要です。各ループで必要な div/class/formatting を追加するだけです。

function echoMenu($arr){
    foreach($arr as $subArr){
        if(!empty($subArr['sub'])){
            echo "<a href='{$subArr['url']}'>{$subArr['title']}</a>";
            echo "<div class='for-sub-links'>";
            echoMenu($subArr['sub']);
            echo "</div>";
        }else{
            echo "<div><a href='{$subArr['url']}'>{$subArr['title']}</a></div>";
        }   
    }
}
于 2013-08-29T20:35:20.173 に答える
1

かなり単純です:

//mainly for demonstration / test purposes
function drawMenuItem($title, $url, $indent) {
    for ($i=0;$i<=$indent;$i++) echo "___";
    echo '<a href="'.$url.'">'.$title.'</a>'.'<br>';
}

//the actual "few lines of code recursively" function
function createMenuRecursively($menu, $indent) {
    foreach($menu as $menuItem){
        drawMenuItem($menuItem['title'], $menuItem['url'], $indent);
        if (is_array($menuItem['sub'])) {
            createMenuRecursively($menuItem['sub'], $indent+1);
        }
    }
}

createMenuRecursively($menu, 1);

$indentデモンストレーションに使用するだけです。//drawMenuItemを行うためにオーバーライドします。上記の出力:CSSulli

ここに画像の説明を入力 オーバーライド

于 2013-08-29T20:50:59.140 に答える
1
function recursive_menu($menu) {
  $output ='';
  foreach($menu as $m){
    $output .= '<li><a href="'.$m['url'].'">'.$m['title'].'</a>';
    if (isset($m['sub'])) {
      $output .= '<ul>';
      foreach( $m['sub'] as $item ) {
        $output.=recursive_menu($item);
      }
      $output .= '</ul>';
    } 
  }
  return $output.'</li>';  
}

それから...

echo '<ul>'.recursive_menu($menu).'</ul>';

このようなもの...

于 2013-08-29T20:41:58.403 に答える