Активный стиль меню динамической навигации PHP

Я хочу создать динамическое меню в PHP и в зависимости от того, на какой странице они находятся в меню, они будут иметь разные стили. У меня есть это, но я не хочу, чтобы это было :(

Это массив, который у меня есть, содержащий информацию из базы данных

Array(

    [Home] => Array
        (
            [url] => Home
            [name] => Home
            [is_home] => 1
        )

    [About] => Array
        (
            [url] => About
            [name] => About
            [is_home] => 0
        )

    [Contact] => Array
        (
            [url] => Contact.php
            [name] => Contact
            [is_home] => 0
        )

)

Это то, что у меня есть на данный момент,

    if(isset($_GET["p"])) {
     if(in_array($page_name, $navigation[$page_name])) {
          $navigation[$page_name]["name"] = "<span>{$navigation[$page_name]["name"]}</span>";
     }
}
foreach ($navigation as $nav) {
     echo "<li><a href=\"" . strtolower($nav["url"]) . "\">{$nav["name"]}</a></li>";
}

Вот как выглядит переменная page_name

$page_name = current(explode(".", ucfirst(strtolower($_GET["p"]))));

Как вы можете видеть, это вставляет теги span в имя меню навигации, поэтому это работает, но я не хочу, чтобы это было так. Я хочу добавить class="active" элемент списка, который является текущей страницей. я просто не знаю как это сделать

Я надеюсь, вы понимаете, что я имею в виду, и прошу прощения за неаккуратные отступы, возникшие при вставке сюда кода.

//Редактировать

Код выборки и массива

$mysql->query("SELECT `page_name`, `is_home` FROM `pages` ORDER BY `order` ASC");

        $navigation_items = array();
        while ($mysql->fetch($row)){
            $navigation_items[] = array(
                "url"   => $row["page_name"],
                "name"  => current(explode(".", $row["page_name"])),
                "is_home"  => $row["is_home"]
            );
        }

        return $navigation_items;

person Ecaz    schedule 05.02.2012    source источник


Ответы (1)


Прежде всего, предоставленный вами массив переформатирован, что означает, что вы изменили индексы на имена страниц, в которых нет необходимости. Вот как вы можете достичь желаемого:

<?php
$menu = $Db->fetchAll("SELECT * FROM `menu`"); //or whatever method you're using to get data from the database.
$current = null;
if(isset($_GET['p'])) {
  $current = current(explode(".", ucfirst(strtolower($_GET["p"]))));
}
$navigation = '';
for($i=0;$i<count($menu);$i++) {
  $url = ucfirst(strtolower($menu[$i]['url']));
  if($current == $url)
    $class = ' class="active"';
  else
    $class = '';
  $name = '<span'.$class.'>'.$menu[$i]['name'].'</span>';
  $navigation .= "<li><a href='{$url}'>{$name}</a></li>";
}
?>
person Ignas    schedule 05.02.2012
comment
Хорошо, я добавил $class в li и удалил span из имени, потому что я хотел, чтобы class=active перешло в li из моего предыдущего скрипта (я немного не понял этого, извините). Проблема в том, что мое меню заканчивается выглядит так, Home Home About Home About Контакты Я убрал именование из массива, думаю проблема в том, что он многомерный. Я обновил исходный пост, чтобы показать вам код выборки и массива. - person Ecaz; 05.02.2012