2011-09-20 11 views
0

我在用PHP進行編程,我用一個'簡寫if'來在頁面上回顯一些HTML代碼,但它表現得很奇怪。用速記回聲如果表現不好

echo '<div id="filter_bar"> 
<ul>'; 
    echo '<li><a href="?select=trending"' . ($_GET['select'] == "trending") ? ' class="filter_selected">Trending</a></li>' : '>Trending</a></li>'; 
    echo '<li><a href="?select=most_picked"' . ($_GET['select'] == "most_picked") ? ' class="filter_selected">Most Picked</a></li>' : '>Most Picked</a></li>'; 
    echo '<li><a href="?select=newest"' . ($_GET['select'] == "newest" || empty($_GET['select'])) ? ' class="filter_selected">Newest</a></li>' : '>Newest</a></li>'; 
echo '</ul></div>'; 

生成的代碼,我得到的結果是這樣的

class="filter_selected">Trending</a></li> class="filter_selected">Most Picked</a></li> class="filter_selected">Newest</a></li> 

正如你所看到的,開頭列表標籤不顯示...但他們做,如果我更換了第一期「 「。在每行用','逗號。

所以這個作品,用逗號

我應該在這裏使用一個逗號?到處都有網上的圖片來展示一段時間'。'

回答

2

也許你可以讓你的生活更容易一點:

echo '<div id="filter_bar"><ul>', 
    '<li><a href="?select=trending"', $_GET['select'] == "trending" ? ' class="filter_selected">' : '>', 'Trending</a></li>', 
    '<li><a href="?select=most_picked"', $_GET['select'] == "most_picked" ? ' class="filter_selected">' : '>', 'Most Picked</a></li>', 
    '<li><a href="?select=newest"', ($_GET['select'] == "newest") || empty($_GET['select']) ? ' class="filter_selected">' : '>', 'Newest</a></li>', 
'</ul></div>'; 

將使用逗號(沒有必要重複迴音那麼多),你不需要重複字符串多,如果你只是想插入類屬性。

然後你利用括號裏不需要他們的地方(見Operator Precedence Docs在那些地方需要的地方,你沒有使用它們(最後一種情況下)。此外,最好先將這些值填充到變量中,以便您可以更輕鬆地進行調試(並且不要將$_GET與輸出混合,以防輸入邏輯與輸入變量混合)。

這樣做你可能已經知道你的問題不在echo之內,而只是你用三元運算符表達的表達式。

$class_trending = $_GET['select'] == "trending" ? ' class="filter_selected"' : ''; 
$class_most_picked = $_GET['select'] == "most_picked" ? ' class="filter_selected"' : ''; 
$class_newest = ($_GET['select'] == "newest") || empty($_GET['select']) ? ' class="filter_selected"' : ''; 

echo '<div id="filter_bar"><ul>', 
    '<li><a href="?select=trending"', $class_trending, '>Trending</a></li>', 
    '<li><a href="?select=most_picked"', $class_most_picked, '>Most Picked</a></li>', 
    '<li><a href="?select=newest"',$class_newest , '>Newest</a></li>', 
'</ul></div>'; 
+0

謝謝你的建議,我想請問一下逗號和週期之間的差異是在這種情況下?正如我通常會使用句點EG:''。 $ class_trending。 ''在你上面發佈的代碼中。有什麼區別嗎? – Luke

+0

使用'.'在輸出前連接字符串。使用逗號只需輸出一個字符串(這符合您的需要)。嚴格說話連接字符串是不需要事先與回聲輸出(但可以完成)。使用''''的另一個好處是你可以在'echo'語句中使用函數,它可以返回一個字符串或者自己迴應(這裏不是這種情況,只是FYI),所以它可以幫助簡化自己的代碼。 – hakre

0

一個可能的解決方案是

echo "<li><a href='?select=newest'"; 
echo ($_GET['select'] == "newest" || empty($_GET['select'])) ? ' class="filter_selected">Newest</a></li>' : '>Newest</a></li>'; 
0

更改括號如下:

echo '<div id="filter_bar"> 
<ul>'; 
    echo '<li><a href="?select=trending"' . ($_GET['select'] == "trending" ? ' class="filter_selected">Trending</a></li>' : '>Trending</a></li>'); 
    echo '<li><a href="?select=most_picked"' . ($_GET['select'] == "most_picked" ? ' class="filter_selected">Most Picked</a></li>' : '>Most Picked</a></li>'); 
    echo '<li><a href="?select=newest"' . (($_GET['select'] == "newest" || empty($_GET['select'])) ? ' class="filter_selected">Newest</a></li>' : '>Newest</a></li>'); 
echo '</ul></div>'; 

如果你不這樣做,PHP不知道你的病情到底是什麼。也可以看看operator precendence,因爲這解釋了它使用逗號的原因。

順便說一下:?:被稱爲ternary operator

3

的原因是:

echo '<li>' . true ? 'aaa' : 'bbb';會給你AAA

,因爲它是一樣有'<li>1' ? 'aaa' : 'bbb'

你應該這樣做: echo '<li>' . (true ? 'aaa' : 'bbb');

1

不知道你的問題,但這個代碼看起來對我來說這是一個醜陋的混亂。 我會這樣做:

在PHP代碼中我會先準備變量。

$sections = array(
    'newest'  => 'Newest', 
    'trending' => 'Trending', 
    'most_picked' => 'Most Picked', 
); 
if (empty($_GET['select']) OR !$choice = array_search($sections,$_GET['select'])) { 
    $choice = 'newest'; 
} 

,然後在模板運行平穩,短環:

<div id="filter_bar"> 
<ul> 
<? foreach ($sections as $sect => $name): ?> 
    <li> 
<a href="?select=<?=$sect?><? if ($choice == $sect) ?>" class="filter_selected"<? endif ?>><?=$name?></a> 
    </li> 
<? endforeach ?> 
</ul> 
</div> 
+1

您不應該依賴short_open_tag,因爲這可能會被禁用。 – str

+0

呃,啓用它。沒什麼大不了的 –

+0

只是不使用它,沒什麼大不了的。 – str