0

私が取り組んでいるポートフォリオ Web サイトのヘッダーに、どのページにどのリンクが表示されるかを制御する小さな switch ステートメントがあります。$id の値は GET 変数から得られます。つまり、'?id=index' です。

    switch($id) {
    case "index":
        //Show links to content
    case !"index":
        //Show link to index
    case !"about":
        //show link to about page
}

問題は、最後の 2 つのケースで NOT 演算子が機能しないことです。ユーザーがインデックスページにいないときにインデックスへのリンクを表示したいのですが、同様にページについても同様です。現在、すべてのリンクがインデックス ページに表示され ($id == "index の場合)、他のページには何も表示されません。

これはなぜでしょうか?

4

7 に答える 7

5

これは、そうあるべきだからです。

switch==演算子を使用して比較します。したがって、2番目のケースでは、実際にテストしています

$id == (!"index")

falseどの文字列trueも true ではなくになるため、これは常に と評価されますfalse

つまり、あなたの場合はifandを使用する方が良いでしょうelse

于 2012-11-14T12:44:36.073 に答える
0

switchcaseは複雑な式を受け入れません。ない!演算子は論理演算子です。このような表現で動作します。

!$x; // true if $x = false

または比較演算子として:

 $a != $b; // Not equal
 // or 
 $a !== $b // not identical

マニュアルより。

switchステートメントのcase式は、単純な型、つまり整数または浮動小数点の数値と文字列に評価される任意の式にすることができます。配列またはオブジェクトは、単純型に逆参照されない限り、ここでは使用できません。

于 2012-11-14T12:48:18.413 に答える
0

コードが実行しているのは、$ idを「index」、!「index」(意味が何であれ)、!「about」の3つの値と比較することです。

あなたのアプローチについてはよくわかりません。if/elseまたは三項演算子を試してみてください。

それがお役に立てば幸いです。

于 2012-11-14T12:49:51.703 に答える
0

Switch はカスタム オペレータを提供しません。

 switch ( $id ) {
     case 'index':
          // $id == 'index'

          break;

     case 'about':
          // $id == 'about'

          break;

     case 'help':
     case 'info':
           // $id == 'info' or $id == 'help'

           break;

     default:
          // all other cases
}
于 2012-11-14T12:53:36.780 に答える
0

申し訳ありませんが、あなたがやろうとしているのは、switch/構文の有効な構文ではありませんcase

探しているものに最も近いのは、defaultオプションを使用することです。これは最後のcaseオプションのように機能し、前の のいずれにも捕捉されなかったすべての値を処理しますcase

switch($id) {
    case "index":
        //Show links to content
    case "about":
        //Show link to about page
    default:
        //show link to default page.
}

break;また、各ブロックの最後に を忘れないでくださいcase。そうしないと、次のブロックに落ちてしまい、予期しないバグが発生する可能性があります。

于 2012-11-14T12:46:43.650 に答える
0

!"index"おそらく次のように評価されますfalse(ただし、構文エラーが発生しなかったことに少し驚いています)。実際には次のステートメントがあります。

switch($id){
    case "index": //...
    case false: // ...
    case false: // ...
}

を使用する場合switchは、次のようにする必要があります。

switch($id){
    case "index": // ...
    case "about": // ...
    default: 
        // Additional statements here, note that $id != "index" is already covered 
        // by not entering into case "index"
}
于 2012-11-14T12:47:19.663 に答える
0

きっとあなたはこれを修正することができます:

switch($id){
    case ($id != 'index'):
        echo 'this is not index';
        break;
    case 'index':
        echo 'this is index';
        break;
    case 'foo':
        echo 'this is foo!';
        break;
    default:
        break;
}

ただし、この例には欠陥があります。最初の case ステートメントは 'index' 以外のものをキャッチするだけなので、case 'foo' にも default ステートメントにもたどり着くべきではありません。

于 2013-10-22T09:39:42.523 に答える