array_search查询数组键索引返回0异常原因咨询
问题根源:PHP的松散比较机制在搞鬼
这个问题的核心其实是array_search默认的**松散比较(==)**在作祟,咱们一步步拆解来看:
第一种场景:无显式键的数组
当你定义数组:
$a = array("a", "b" => 4, "c" => 193);
PHP会自动给没有指定键的第一个元素分配数字键0,所以array_keys($a)返回的数组是:
[0, "b", "c"]
接下来执行array_search("c", array_keys($a))时,因为默认用松散比较,PHP会做类型转换:当字符串和数字比较时,字符串会被转为数字。"c"转成数字的结果是0(因为它没有有效数字开头)。这时候0 == "c"会被判定为true,所以array_search直接返回第一个匹配项的索引——也就是0,这显然不是你想要的结果。
第二种场景:有显式键的数组
当你给第一个元素加上显式键"a" => 123后,array_keys($a)返回的数组变成:
["a", "b", "c"]
这时候搜索"c"时,松散比较下,"a"、"b"都和"c"不相等,直到第三个元素才匹配,所以返回正确的索引2。
解决方案:开启严格比较
要解决这个问题,只需要给array_search加上第三个参数true,开启严格比较(===),这样会同时检查值和类型是否完全匹配:
$a = array("a", "b" => 4, "c" => 193); $idx = array_search("c", array_keys($a), true); var_dump($idx); // 输出 int(2)
开启严格模式后,整数0和字符串"c"类型不同,不会被判定为相等,array_search会找到真正匹配的"c",返回正确的索引。
内容的提问来源于stack exchange,提问作者T.Todua
相关产品推荐
相关产品推荐

