2

私はこのコードを持っています

$arr = array(
    "0"=>"http://site.com/somepage/param1/param2/0",
    "1"=>"http://site.com/somepage/param1/param2/1",
    "thispage" => "http://site.com/somepage/param1/param2/2",
    "3"=> "http://site.com/somepage/param1/param2/3"
);



foreach ($arr as $k=>$v) {
    if ($k == "thispage") {
        echo $k." ";
    }
    else {
        echo '<a href="'.$v.'">'.$k.'</a> ';
    }
}

"0"=>"http://site.com/somepage/param1/param2/0",最初の要素がリンクを作成しなかったため、その驚き(他の要素は正常に動作します)

0たとえば、最初の要素キーを別のものに置き換える4と、リンクが作成されます。なにが問題ですか ?

4

6 に答える 6

5

これは0 == "thispage"、最初のキーが0. これについて詳しく知りたい場合は、Type Jugglingに関する PHP マニュアル ページを参照してください。

は と等しいが同一ではないため、(" is equal to") の代わりに ( " ===is同一の") を使用します。==0"thispage"

これは で起こること==です:

  • $keyintegerの値を取る0
  • PHPは比較しようとします0 == "thispage"
  • "thispage"比較するには、キャストする必要がありますinteger
  • 結果の比較は0 == 0であり、これはtrue

使用する場合===:

  • $keyintegerの値を取る0
  • PHPは比較しようとします0 === "thispage"
  • ( ) は( )0とは異なる型であるため、結果は次のようになります。integer"thispage"stringfalse
于 2012-11-21T13:57:21.753 に答える
2

次のことを行います。

if ($k === "thispage")

等しい比較演算子はここでは役に立たないため、同一の比較演算子 を使用する必要があります。===

数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、数値として比較が実行されます。

thispage数値に変換すると が返される0ため、等号比較演算子を使用すると if ステートメントが一致します=====タイプが一致しない場合に同一比較を行うと、false が返されます。

比較演算子については、こちらを参照してください。

于 2012-11-21T13:58:02.690 に答える
2

これはあなたが間違っていることです。

if ($k === "thispage") {
    echo .$k." ";
}
于 2012-11-21T13:59:28.710 に答える
1

これを試して:

if ($k === "thispage") {
        echo $k." ";
    }
于 2012-11-21T13:58:34.640 に答える
0

表示される結果の理由は、使用する比較演算子です。== は不正確すぎる場合があり、このような奇妙な結果になる可能性があります。=== を使用すると、値の正確性が比較され、問題が回避されます。

それで:

foreach ($arr as $k=>$v) {
    // this is the important thing
    if ($k === "thispage") {
        echo $k." ";
    }
    else {
        echo '<a href="'.$v.'">'.$k.'</a> ';
    }
}
于 2012-11-21T14:01:58.640 に答える