当前菜单项-foreach


Current menu item - foreach

考虑一下:

    $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>

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

为了获得当前页面,我这样做:

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

而且效果也很好。

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

谢谢。Alex

    <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>

Easy,在循环中,检查是否为$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>
<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>

所以我在你的帮助下成功了!谢谢大家。特别感谢阿黛尔——尽管你在那里犯了一个错误,但我还是这样纠正了:

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

太棒了!再次感谢!

<?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()?

您可以使用三元语法来解决问题。它由以下语法组成:

(if condition ? true : false)

因此,我们可以在foreach循环中使用这种方法来比较curPageNameurl的答案。

$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>';

$template中的每个%s项都将通过顺序变量进行更改。因此,如果您需要更改模板,代码是干净的,并且最容易维护。

或者,如果您想要另一种最简单的模板方式,请使用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>