2011-03-24 185 views
1

我有這樣的代碼:如何重構這些if語句?

<div id="menu"> 
    <ul> 
     <li><span id="menulabel">Your Languages</span></li> 
     <?php 
     $hotClass = ''; 
     $newClass = ''; 
     $topClass = ''; 
     if ($sort == 'hot') 
      $hotClass = 'active'; 
     else if ($sort == 'new') 
      $newClass = 'active'; 
     else if ($sort == 'top') 
      $topClass = 'active'; 
     ?> 
     <li><a id="Hot" href="index.php?sort=hot&page=1" class="<?php echo $hotClass; ?>">Hot</a></li> 
     <li><a id="New" href="index.php?sort=new&page=1" class="<?php echo $newClass; ?>">New</a></li> 
     <li><a id="Top" href="index.php?sort=top&page=1" class="<?php echo $topClass; ?>">Top</a></li> 
    </ul> 
</div> 

根據其排序的頁面使用不同的菜單項被高亮顯示給用戶。但是,我真的不喜歡這個代碼,因爲當列表項不活動時,類是空的而不是不存在的。另外,每個if語句基本上都是一樣的。是否有可能將此重構爲更優雅和可讀的內容?謝謝。

回答

2

您可以考慮使用這裏的三元...

<div id="menu"> 
    <ul> 
     <li><span id="menulabel">Your Languages</span></li> 
     <li><a id="Hot" href="index.php?sort=hot&page=1" class="<?php echo ($sort == 'hot') ? 'active' : '' ?>">Hot</a></li> 
     <li><a id="New" href="index.php?sort=new&page=1" class="<?php echo ($sort == 'new') ? 'active' : '' ?>">New</a></li> 
     <li><a id="Top" href="index.php?sort=top&page=1" class="<?php echo ($sort == 'top') ? 'active' : '' ?>">Top</a></li> 
    </ul> 
</div> 

無疑節省了大量的代碼

如果你不熟悉Ternary Operator

(condition) ? 'result if true' : 'result if false' 

編輯

由於Matijs指出了

,你甚至可以在運營商內部的整個類的聲明,以避免結束了class=""

<li><a id="Hot" href="index.php?sort=hot&page=1" <?php echo ($sort == 'hot') ? 'class="hot"' : '' ?> >Hot</a></li>` 
+1

,如果你不喜歡可以空類的屬性,你甚至可以把裏面那些像< ?php echo($ sort =='hot')? 'class =「active」':''?> – Matijs 2011-03-24 22:49:19

0

使用'hot''new'和'top'作爲例子,或者,如果第一個字符串與'$ sort'值匹配,則需要兩個字符串的方法,然後將第二個字符串設置爲活動

0
<div id="menu"> 
<ul> 
    <li><span id="menulabel">Your Languages</span></li> 
    <li><a id="Hot" href="index.php?sort=hot&page=1" class="<?php echo ($sort=='hot')?'active':''; ?>">Hot</a></li> 
    <li><a id="New" href="index.php?sort=new&page=1" class="<?php echo ($sort=='new')?'active':''; ?>">New</a></li> 
    <li><a id="Top" href="index.php?sort=top&page=1" class="<?php echo ($sort=='top')?'active':''; ?>">Top</a></li> 
</ul></div> 

如果 「short_tags」未啓用。如果已啓用,可以更換< PHP回聲「與」 < =」

+0

如果您使用短標籤,爲什麼不使用'<?='? – jondavidjohn 2011-03-24 22:46:17

+0

他的PHP版本可能沒有啓用short_tags,所以我沒有。我說過如何在代碼下面使用短標籤... – Chris 2011-03-24 22:47:45

+0

,因爲您使用的是<? echo' – jondavidjohn 2011-03-24 22:49:15

-1

,我能想到的是改變你的URL參數,另一種可能的方式嘗試這個辦法:??

<div id="menu"> 
    <ul> 
     <li><span id="menulabel">Your Languages</span></li> 
     <li><a id="Hot" href="index.php?hot=active&page=1" class="<?php echo $_GET['hot']; ?>">Hot</a></li> 
     <li><a id="New" href="index.php?new=active&page=1" class="<?php echo $_GET['new']; ?>">New</a></li> 
     <li><a id="Top" href="index.php?top=active&page=1" class="<?php echo $_GET['top']; ?>">Top</a></li> 
    </ul> 
</div> 
0

也許使用循環和數組?

<div id="menu"> 
    <ul> 
    <li><span id="menulabel">Your Languages</span></li> 
     <?php 
    foreach(array("Hot","New","Top") as $Id) { 
     $class = ''; 
     if ($sort == strtolower($Id)) $class = 'active'; 
     echo "<li><a id='$Id' href='index.php?sort=".strtolower($Id)."&page=1' class='$class'>$Id</a></li>"; 
    } 
    ?> 
    </li> 
    </ul> 
</div> 
0

下面是一些不太重複另一個建議。

<?php 
function sortClass($val) { 
    return ($sort == $val) ? 'class="active"' : ''; 
} 
?> 
<li><a id="Hot" href="index.php?sort=hot&page=1" <?=sortClass('hot');?> >Hot</a></li> 
<li><a id="New" href="index.php?sort=new&page=1" <?=sortClass('new');?> >New</a></li> 
<li><a id="Top" href="index.php?sort=top&page=1" <?=sortClass('top');?> >Top</a></li> 
0

由於您在此處理演示文稿(即添加CSS類,最有可能僅僅改變外觀),你也可以使用JavaScript應用樣式(ALA Progressive Enhancement):

<div id="menu" data-sort="<?php echo $sort; ?>"> 
    <ul> 
     <li><span id="menulabel">Your Languages</span></li> 
     <li><a id="hot" href="index.php?sort=hot&page=1">Hot</a></li> 
     <li><a id="new" href="index.php?sort=new&page=1">New</a></li> 
     <li><a id="top" href="index.php?sort=top&page=1">Top</a></li> 
    </ul> 
</div> 

<script type="text/javascript"> 
var sort = $("#menu").attr("data-sort"); // HTML5 FTW! 
$("#menu li." + sort).addClass("active"); 
</script>