Эхо с сокращением, если не ведет себя должным образом - PullRequest
0 голосов
/ 20 сентября 2011

Я программирую на PHP, я использую 'сокращение, если', чтобы вывести некоторый 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>

Как видите, теги начального списка не отображаются ... но они появляются, если я заменяю первый период '.' в каждой строке с запятой ','.

Так что это работает, с запятыми

Должен ли я использовать запятую здесь? Повсюду в сети показывается точка '.'

Ответы [ 5 ]

3 голосов
/ 20 сентября 2011

Причина:

echo '<li>' . true ? 'aaa' : 'bbb'; даст вам ааа ,

, потому что то же самое с '<li>1' ? 'aaa' : 'bbb'

И вы должнысделать так: echo '<li>' . (true ? 'aaa' : 'bbb');

2 голосов
/ 20 сентября 2011

Может быть, вы можете немного облегчить свою жизнь:

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

Который будет использовать запятые (не нужно многократно повторять эхо), и вам не нужно будет повторять слишком много строк, если вы только хотите вставить атрибут класса.

Затем вы использовали круглые скобки там, где они не были нужны (см. Приоритет оператора Документы ) , но в месте, где эти нужны, вы их не использовали (последний случай).

Кроме того, лучше заполнить эти значения переменными заранее, чтобы можно было легче отлаживать вещи (и вы не смешиваете $_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>';
1 голос
/ 20 сентября 2011

Не знаю, какая у вас проблема, но этот код выглядит для меня ужасно.Я бы сделал это следующим образом:

в коде 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>
0 голосов
/ 20 сентября 2011

Измените свои круглые скобки на следующие:

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 не знает, каково именно ваше состояние.Также обратите внимание на приоритет оператора , поскольку это объясняет, почему он работает с запятыми.

Кстати:?: Называется троичный оператор .

0 голосов
/ 20 сентября 2011

Одним из возможных решений является

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