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

これはカンマを使用し(エコーをそれほど繰り返す必要はありません)、クラス属性のみを挿入する場合は、文字列をそれほど繰り返す必要はありません。

次に、必要のない場所で括弧を使用しましたが (演算子の優先順位のドキュメントを参照) 必要な場所では使用しませんでした (最後のケース)。

さらに、これらの値を事前に変数に入力することをお勧めします。これにより、デバッグが容易になります (また、$_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

1つの可能な解決策は

    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 に答える