2013-08-06 61 views
2

我無法理解在下面的例子中array_search結果(並沒有發現討論這個任何存在的問題):爲什麼array_search找不到,除非數組被排序?

<?php 

    $values = array(
     15, 
     12, 
     "15", 
     34, 
     15 => 25, 
     "xx" => 15 
    ); 
    echo "PHP-Version is " . phpversion(); 
    echo "<h1>Array:</h1><pre>";var_dump($values);echo "</pre>";  

    // sort($values); // remove comment and 15 will be found in ALL cases! 

    $key = array_search("15",$values); 
     show_result('(a) Searching "15"'); 

    $key = array_search("15",$values,true); 
     show_result('(b) Searching "15",true'); 

    $key = array_search(15,$values); 
     show_result('(c) Searching 15'); 

    $key = array_search(15,$values,false); 
     show_result('(d) Searching 15,false'); 

    $key = array_search(15,$values,true); 
     show_result('(e) Searching 15,true'); 



function show_result($tit) {  
    global $key,$values; 
    echo "<h2>$tit</h2>"; 

    if (!$key) { 
     echo "Not found"; 
     } else { 
      echo "Found key $key - " . gettype($values[$key]); 
    } 
} 
?> 

只搜索(B) - 嚴格的字符串搜索找到了這個值,數字搜索沒有找到它。所有的搜索都會在數組排序後找到它 - 但doc根本沒有提到這樣的要求。有人可以解釋這種行爲嗎?

+0

if($ key === false)因爲索引0也是false。 – Salketer

+0

一旦OP已經閱讀手冊。太糟糕了,你沒有完整閱讀它。 ;-P – deceze

回答

4

15位於密鑰0array_search返回此00評估爲false。因此,您的支票if (!$key)因鑰匙0而失敗。你必須檢查嚴格的=== falsethe manual有一個巨大的紅色警告解釋這一點。

+0

謝謝 - 我非常專注於陣列,所以我沒有對結果的類型給予足夠的重視。 – MBaas

1

我認爲這是因爲array_search的返回值是一個混合值。當您執行第一次搜索時,它會在位置0處找到該值,並因此返回鍵索引,該索引又將被評估爲false

1

這裏的總交代:

在所有的情況下,$鍵等於0,因爲你正在做一個簡單的測試像if($key) 0計算結果爲假讓你認爲搜索是不是成功的。將其更改爲if($key===false)將無任何問題。

當你對數組進行排序時,它沒有任何問題的原因是因爲值12在裏面,所以它取得了鍵0,並且在鍵0的15現在在鍵1並且1取值爲true

相關問題