6

最近、自分のコードで array_search 関数を使用しているときに問題があることに気付きました。配列「$allcraftatts」で値「sharp」を検索しています。2行の実験を設定して問題を切り分けようとしました:

$testcopy=$allcraftatts;
$testsharp=array_search("sharp", $testcopy);

「print_r(get_defined_vars());」の使用 後で、次の結果が得られます。

[testcopy] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                    [3] => 0
                    [4] => 0
                    [5] => 0
                    [6] => Sharp Stone
                    [7] => Sharp Stones
                    [8] => stone
                    [9] => object
                    [10] => sharp
                    [11] => hard
                    [12] => 0
                    [13] => 0
                    [14] => 0
                    [15] => 0
                    [16] => 0
                    [17] => 0
                    [18] => 0
                )

[testsharp] => 0

これらの変数を変更しないように注意しました。

さて、コードを次のように変更すると

$testcopy=$allcraftatts;
unset($testcopy[0]);
$testsharp=array_search("sharp", $testcopy);

「1」を返します。

これにより、常に配列の最初のキーが返されると思います。

それは私を困惑させます!これは、言語自体に問題があるのではないかと心配させるバグの 1 つです。これがいかに疑わしいものであったとしても、私は最終的に PHP のソースに何か問題があるかどうかを確認するように駆り立てられましたが、残念ながらそれを理解することはできませんでした。

このように単純な関数である以上、必然的に単純な答えに完全に屈辱を感じるでしょうが、この時点では答えが欲しいだけです。

4

3 に答える 3

8

array_search==検索中に値を比較するために使用 しています

フォーム PHP ドキュメント

3 番目のパラメーター strict が TRUE に設定されている場合、array_search() 関数は干し草の山で同一の要素を検索します。これは、干し草の山にある針のタイプもチェックすることを意味し、オブジェクトは同じインスタンスでなければなりません。

最初の要素は検索中0に変換された文字列であるため0

簡単なテスト

var_dump("sharp" == 0); //true
var_dump("sharp" === 0); //false

ソリューションを使用strictして同一の値を検索するオプション

$testsharp = array_search("sharp", $testcopy,true);
                                               ^---- Strict Option

var_dump($testsharp);

出力

10
于 2012-11-06T21:29:09.087 に答える
2

検索されたキーの前のキーが数値ゼロの場合、そのキーが返されます。これは、配列のデータ型によって支配される「緩やかな」一致を実行しているためであり、「シャープ」( に変換された場合int) はゼロとしてカウントされます。厳密なチェックを使用して、正しい値が見つかります。

それ以外の場合は、実行して

$testcopy = array_map('strval', $testcopy);

値が文字列に変換されるように、「緩い」チェックでも機能します。

于 2012-11-06T21:31:00.447 に答える
1

ルーズタイピングの素晴らしい世界へようこそ。PHP では、array_search はデフォルトで厳密でない比較 ("==") に設定されていますが、3 番目のパラメーターを追加して厳密な比較 ("===") を強制することができます。nonstrict が正しい操作である場合もありますが、ほとんどの場合、strict が必要です。

以下をチェックしてください。

$allcraftatts = array(0, 0, 0, 0, 0, 0, "Sharp Stone", "Sharp Stones", "stone", new stdClass(), "sharp", "hard", 0, 0, 0, 0, 0,0 ,0);
$testcopy=$allcraftatts;
$testsharp=array_search("sharp", $testcopy);
$testsharpStrict=array_search("sharp", $testcopy, true);

print_r(get_defined_vars());                                                                                                                                                                                                                        

if(0 == "sharp"){
    echo "true for == \n";
}else{
    echo "false == \n";
}
if(0 === "sharp"){
    echo "true for === \n";
}else{
    echo "false === \n";
}

そして出力:

[testcopy] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 0
            [3] => 0
            [4] => 0
            [5] => 0
            [6] => Sharp Stone
            [7] => Sharp Stones
            [8] => stone
            [9] => stdClass Object
                (
                )

            [10] => sharp
            [11] => hard
            [12] => 0
            [13] => 0
            [14] => 0
            [15] => 0
            [16] => 0
            [17] => 0
            [18] => 0
        )

    [testsharp] => 0
    [testsharpStrict] => 10
)
true for == 
false === 
于 2012-11-06T21:35:44.137 に答える