为什么array_search找不到,除非数组已排序?

时间:2013-08-06 08:11:53

标签: php php-5.4

我在下面的示例中无法理解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根本没有提到这样的要求。有人可以解释这种行为吗?

3 个答案:

答案 0 :(得分:4)

15位于键0array_search会返回此00评估为false。因此,对if (!$key)键的检查0失败。您必须检查严格=== falsethe manual中有一个巨大的红色警告解释了这一点。

答案 1 :(得分:1)

我认为这是因为array_search的返回值是混合值。当您执行第一次搜索时,它将在位置0处找到值,并因此返回键索引,而索引又将被评估为false

答案 2 :(得分:1)

以下是总解释:

在所有情况下,$ key等于0,因为你正在进行像if($key)这样的简单测试,0评估为false会让你认为搜索不成功。将其更改为if($key===false)将毫无问题地工作。

排序数组时它没有任何问题的原因是因为值12在内部所以它取得键0而键0处的15现在在键1处且1计算为{{1} }。