当前菜单项 - foreach

时间:2012-07-28 19:15:27

标签: php

考虑一下:

    $menuItems = array (
        "page1" => "1.php",
        "page2" => "2.php",
        "page3" => "3.php",
        "page4" => "4.php",
        "page5" => "5.php",
     );

现在我创建了这样的菜单:

    <ul class="menu">
        <?php 
           foreach($menuItems as $name => $url) {
           echo "<li><a href='$url' class='$class'>$name</a></li>";
           } 
        ?>
    </ul>

效果很好。但是现在我需要在当前页面上添加一个类.current。

要获取当前页面,我执行此操作:

      <?php 
         function curPageName() {
            return substr($_SERVER["SCRIPT_NAME"],strrpos($_SERVER["SCRIPT_NAME"],"/")+1);
         }
         $curpage = curPageName();
      ?>

它也很有效。

所以我想问题是如何将$ curpage分配给...当前页面? :)

谢谢。 亚历

6 个答案:

答案 0 :(得分:1)

简单,在你的循环中,检查是否$url == $curpage,并适当追加。

示例:

<?php

    $menuItems    = array(
        "page1" => "1.php",
        "page2" => "2.php",
        "page3" => "3.php",
        "page4" => "4.php",
        "page5" => "5.php",
    );
    $current_item = "2.php"; //Assume we got this from the function
?>
<ul class="menu">
    <?php
    foreach ($menuItems as $name => $url) {
        echo "<li><a href='$url'";
        if ($url == $current_item) {
            echo " class='current'";
        }
        echo ">$name</a></li>\n";
    }
    ?>
</ul>

答案 1 :(得分:1)

    <ul class="menu">
    <?php 
       foreach($menuItems as $name => $url) {

       if ($url === $curpage){
          $class.=' .current';
       }

       echo "<li><a href='$url' class='$class'>$name</a></li>";

       } 
    ?>
    </ul>

答案 2 :(得分:0)

<ul class="menu">
    <?php 
       foreach($menuItems as $name => $url) {
       $class = 'default';
       if (curPageName() == $name) {
          $class.='.current';
       } 
       echo "<li><a href='$url' class='$class'>$name</a></li>";
       } 
    ?>
</ul>

答案 3 :(得分:0)

所以我在你的帮助下工作了!多谢你们。 特别感谢Adel - 尽管你在那里遇到了一个错误,我还是这样修理了它:

    foreach($menuItems as $name => $url) {
          $class = 'default';
          if (curPageName() == $url) {
             $class.=' \. current';
          } 
         echo "<li><a href='$url' class='$class'>$name</a></li>";
         } 

真棒!再次感谢!

答案 4 :(得分:0)

<?php
  $menuItems = array(
               'page1' => '1.php',
               'page2' => '2.php',
               'page3' => '3.php',
               'page4' => '4.php',
               'page5' => '5.php',
  );
  $current_page = curPageName();
?>
<ul class="menu">
  <?php
    foreach ($menuItems as $name => $url) {
  ?>
    <li><a href="<?php=$url?>"
    <?php 
      if ($url == $current_page) {
    ?>
    class="current"
    <?php 
      } 
    ?>
    ><?php=$name?></a></li>
  <?php 
    }
  ?>
</ul>

为什么在每次迭代时都使用curPageName()?

答案 5 :(得分:0)

您可以使用三元语法来解决您的问题。它包含以下语法:

(if condition ? true : false)

因此,我们可以在您的回答中使用这种方式,将curPageName与foreach循环中的url进行比较。

$url == curPageName() ? 'current' : 'notCurrent'

现在你只需要对你有利。

我喜欢 printf 的语法。所以代码更干净。试试这个:

<?php
/**
 * curPageName()  is defined in question
 * my_links() is a shortcut to array defined in question
 */
$template = "<li%s><a href="%s">%s</a></li>";
$links    = my_links();
$current  = curPageName();
print '<ul class="menu">';
foreach ($likns as $name => $url) {
  $class = $current == $url ? ' class="current"' : '';
  printf($template, $class, $url, $name);
}
print '</ul>';

%s中的每个$template项都会被顺序变量更改。因此,如果您需要更改模板,则代码是干净的,而且最简单,以提供维护。

或者,如果您想要另一种最简单的模板方式,请使用php模板语法。请注意在foreach语句和:之后使用endforeach。你可以看到我使用的是echo <?=$var?>的短代码,它比<?php echo $var ?>更具有可复制性。

<?php
/**
 * curPageName()  is defined in question
 * my_links() is a shortcut to array defined in question
 */
$links   = my_links();
$current = curPageName();
?>
<ul class="menu">
  <?php foreach ($links as $name => $url): ?>
    <li<?=($current == $url ? ' class="current"' : '')?>>
        <a href="<?=$url?>"><?=$name?></a>
    </li>
  <?php endforeach ?>
</ul>