2012-11-06 68 views
6

我最近注意到在我的代碼中使用array_search函數時遇到了麻煩。我正在搜索數組「$ allcraftatts」的值「sharp」。我試圖通過建立一個兩線實驗隔離問題:PHP array_search始終返回數組的第一個鍵

$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」。

這使我相信它總是返回數組中的第一個鍵。

它讓我感到困惑!這是那些讓你害怕語言本身出錯的錯誤之一。然而令人懷疑的是,實際上我最終被迫去看看PHP源代碼中是否有錯誤,但不幸的是無法理解它。

鑑於這是一個簡單的功能,我肯定會被不可避免的簡單答案完全侮辱,但在這一點上,我只想要一個答案。

+0

什麼版本的PHP您使用的是?你也可以向我們展示'var_dump'的輸出而不是'print_r'嗎?它會顯示你是否有任何額外的空間(這是一個常見的使用'array_search'的人打嗝的經驗) –

回答

8

array_search使用==搜索

FORM PHP DOC

期間如果嚴格第三個參數被設置爲TRUE,則array_search()函數將搜索在草堆相同的元件對值進行比較。這意味着它也將檢查乾草堆中針的類型,並且對象必須是相同的實例。

Becasue第一元素是0搜索

簡單測試

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

解使用strict選項來搜索相同的值

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

var_dump($testsharp); 

輸出

期間字符串被轉換爲 0
10 
2

如果搜索一個之前的任何鍵數字零,則返回該密鑰,因爲它正在執行一個「鬆散」匹配由陣列的數據類型爲主,「鋒利」(如果換算到int)計爲零。使用嚴格的檢查,找到正確的值。

否則,通過執行

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

使值轉換爲字符串,它的工作原理也與「寬鬆」檢查。

1

歡迎來到寬鬆打字的美妙世界。在php中,array_search默認爲非嚴格比較(「==」),但您可以添加第三個參數來強制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 ===