0

多次元配列と再帰を使用してナビゲーションを構築しようとしています。次のコードがあります。

最初に<?php $title = 'pagename'; ?>、doctype の下の個々のページで実行します (アクティブなクラスの検出のため)。

配列:

<?php

$nav_array = array ('Home' => 'index.php',
                   'About' => array ( 'about.php', array (
                        'Michael' => array( 'michael.php', array (
                            'Blog' => 'blog.php',
                            'Portfolio' => 'portfolio.php')), 
                        'Aaron' => 'aaron.php' , 
                        'Kenny' => 'kenny.php', 
                        'David'=> 'david.php')),

                   'Services' => array ( 'services.php', array (
                        'Get Noticed' => 'getnoticed.php', 
                        'Hosting' => 'hosting.php')),

                   'Clients' => 'clients.php',
                   'Contact Us' => 'contact.php'
    );

    $base = basename($_SERVER['PHP_SELF']);
?>

FOREACH: (ナビゲーションを生成)

<ul>
<?php

foreach ($nav_array as $k => $v) {
    echo buildLinks ($k, $v, $base);    
}
?>
</ul>

buildLinks:

<?php // Building the links

function buildLinks ($label_name, $file_name, $active_class) {
    if ($label_name == $title) {
        $theLink = "<li><a class=\"selected\" href=\"$file_name\">$label_name</a></li>\n";
    } else {
        $theLink = "<li><a href=\"$file_name\">$label_name</a></li>\n";
    }

    return $theLink;
}


?>

結果: http://khill.mhostiuckproductions.com/siteLSSBoilerPlate/arraytest.php

サブメニューは、CSS を使用して親要素のホバーに表示されます。配列以外は何も変更せずに、複数のサブレベルを通過できる必要があります。

foreach が配列の残りの部分を再帰的に通過するようにするにはどうすればよいですか?

(注:アクティブのクラスを現在のページに適用し、矢印のクラスをサブメニューが存在する親要素に適用する機能が必要です。)

4

2 に答える 2

1

ナビゲーションの構築に使用するデータ構造に関係なく、関数を再帰的にする必要があります。これが手っ取り早い方法です。

echo "<ul>";
foreach ($nav_array as $nav_title => $nav_data) {
  echo buildLinks($nav_title, $nav_data, $base, $title);
}
echo "</ul>";

/* NOTE that we pass $title to the function */
function buildLinks ($label_name, $file_name, $active_class, $title) {

  $theLink = '';
  /* this is dirty code, you should reconsider your data structure */
  $navigation_list = false;
  if (is_array($file_name)) {
    $navigation_list = $file_name[1];
    $file_name = $file_name[0];
  }

  if ($active_class == $title) {
    $theLink = "<li><a class=\"selected\" href=\"$file_name\">$label_name</a></li>\n";
  } else {
    $theLink = "<li><a href=\"$file_name\">$label_name</a></li>\n";
  }

  if ($navigation_list) {
    $theLink .= "<ul>";
    foreach ($navigation_list as $nav_title => $nav_data) {
      $theLink .= buildLinks($nav_title, $nav_data, $active_class, $title);
    }
    $theLink .= "</ul>";
  }

  return $theLink;
}

とにかくクリーンなソリューションではありません。もし私があなたなら、データ構造をより扱いやすいものに変更します。

于 2013-02-21T21:54:03.500 に答える
0

これは非常にまずい方法だと思います。メニュー要素を XML または JSON として保存し、パーサーを使用することをお勧めします。それはあなたの仕事を容易にします。

于 2013-02-21T21:00:28.210 に答える