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>

如您所见,开始列表标签没有显示......但如果我替换第一个句点'。在每一行上用“,”逗号。

所以这行得通,用逗号

我应该在这里使用逗号吗?网上到处都显示一个句号'。

4

5 回答 5

3

原因是:

echo '<li>' . true ? 'aaa' : 'bbb';会给你aaa

因为它与'<li>1' ? 'aaa' : 'bbb'

你应该这样做: echo '<li>' . (true ? 'aaa' : 'bbb');

于 2011-09-20T10:49:08.163 回答
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>';

哪个将使用逗号(不需要重复 echo 那么多),如果您只想插入 class 属性,则不需要重复那么多字符串。

然后,您在不需要它们的地方使用了括号(请参阅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>';
于 2011-09-20T10:47:28.807 回答
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>
于 2011-09-20T10:53:02.177 回答
0

一种可能的解决方案是

    echo "<li><a href='?select=newest'"; 
echo ($_GET['select'] == "newest" || empty($_GET['select'])) ? ' class="filter_selected">Newest</a></li>' : '>Newest</a></li>';
于 2011-09-20T10:41:27.450 回答
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 不知道你的条件到底是什么。还可以查看运算符优先级,因为这解释了为什么它使用逗号起作用。

顺便说一句: ?: 被称为三元运算符

于 2011-09-20T10:42:25.193 回答