簡體   English   中英

range()和in_array()行為,我在這里做錯了什么?

[英]range() and in_array() behaviour, what am I doing wrong here?

這是代碼,檢查輸出 - > http://codepad.org/7n7dM54e

<?php

$key = "a";
$array = range("0","7");
echo "array is : \n";
var_dump($array);
echo "key is : $key \n";
echo "in_array result \n";
var_dump(in_array($key,$array)); // why is it true, 'a' is not a "0" string or 0 int
echo "array_search result \n";
var_dump(array_search($key,$array)); // why is it index 0

?>

in_array()array_search()支持類型安全檢查,第三個參數設置為true 不會執行任何轉換,並且將按原樣比較值,並考慮類型(與===運算符一樣)。

因此,如果您在每個函數調用結束時傳遞true ,您將獲得預期的結果:

// Both should return false
var_dump(in_array($key, $array, true));
var_dump(array_search($key, $array, true));

為什么會這樣

是的,它絕對是一種類型轉換,但不是由in_array()array_search()專門實現的轉換。 它只不過是==運算符執行的松散比較。

兩個方法都調用一個名為php_search_array()的C函數。 該函數在/ext/standard/array.c定義。 以下是前幾行中的一些內容:

static void php_search_array(INTERNAL_FUNCTION_PARAMETERS, int behavior) /* {{{ */
{
    // ---------- snip ----------

    int (*is_equal_func)(zval *, zval *, zval * TSRMLS_DC) = is_equal_function;

    // ...

    if (strict) {
        is_equal_func = is_identical_function;
    }

    // ---------- snip ----------
}

如果我沒有錯,你看到的is_equal_function只對應於(但實際上可能不是) ==運算符,無論數據類型如何,都會進行非常簡單的比較。 可能會發生類型轉換。 (同樣, is_identical_function對應於=== 。)

例如, '2abc' == 2為真,但'2abc' == 3為假。 這是因為比較字符串和整數會導致在比較之前將字符串強制轉換為整數。 因此,將字符串'2abc'強制轉換為int將返回2。

因此,就像我在下面所說的那樣,當你將'a'傳遞給兩個函數時同樣適用:它被轉換為一個整數,結果為0 ,它存在於range()返回的數組中。 就像我說的那樣,無論是將整數還是數字字符串作為參數傳遞, range()返回一個整數(或浮點數)數組。

PHP的比較運算符手動輸入

如果將數字與字符串進行比較或比較涉及數字字符串,則每個字符串將轉換為數字,並且數字執行比較。


舊“為什么會這樣”

我認為in_array()array_search()的內部實現默認嘗試將針轉換為與被搜索數組中元素相同的類型。 如果是這種情況,由於range()返回一個整數數組,字符串'a'將轉換為一個整數,該整數為0 ,因此將返回兩個函數調用的結果。 請注意,即使將數字作為字符串傳遞, range()也會生成整數或浮點數組。

好吧,這似乎是一個錯誤的數組,其中有一個'0'

如果你改變$array = range("0","7"); to $array = range("1","7"); ,你會理解我想說的

http://codepad.org/3099zpch

另請閱讀php手冊http://php.net/manual/en/function.in-array.php中的注釋

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM