← PHP rsort()函数:数组降序排序的实战教程 PHP array_shift()函数教程:移除数组首元素与键名重建实战 →

PHP array_search()函数教程:数组值查找与键名返回实战

著
原创 2026-10-09 PHP 已有人查阅

一、函数定位与基本概念

array_search()是PHP内置的数组搜索函数,作用是在数组中查找某个值,找到后返回该值对应的第一个键名。这个函数从PHP4.0.5开始提供,属于日常开发中处理数组数据时经常会用到的工具。

它的函数原型如下:

mixed array_search ( mixed $needle , array $haystack [, bool $strict = FALSE ] );

参数说明:

参数 说明 是否必需
needle 要搜索的值 必需
haystack 被搜索的输入数组 必需
strict 是否开启严格类型检查,默认FALSE 可选

返回值方面,搜索成功时返回对应的键名,这个键名可能是整数,也可能是字符串。搜索失败时返回FALSE。如果数组中存在多个相同的值,只返回第一个匹配到的键名。

这里有一个容易被忽略的细节:返回的键名如果是0或空字符串,在布尔判断中会被当作假值。因此判断搜索结果时,应该用!==false而不是!==false之外的松散判断。

二、基础用法与代码号学习编程示例

先看一个最直接的数字索引数组例子。代码号学习编程时,经常用课程名称数组来演示搜索逻辑:

<?php
$course = array(0 => 'java', 1 => 'os', 2 => 'c', 3 => 'compiler');
$result = array_search('compiler', $course);
print_r($result);
?>

输出结果为:

3

array_search()在数组中找到了'compiler',返回它对应的键名3。

再看关联数组的情况。关联数组的键名是字符串,搜索成功后返回的也是字符串键名:

<?php
$color = array("a" => "red", "b" => "yellow", "c" => "green");
print_r(array_search("red", $color));
?>

输出结果为:

a

这个例子说明,array_search()并不区分数组是索引数组还是关联数组,它只关心值和键的对应关系。

三、严格模式:array_search()的关键分水岭

第三个参数strict是array_search()最需要认真对待的地方。默认情况下,strict=FALSE,函数使用松散比较(loosecomparison)。开启严格模式后,使用===进行全等比较,值和类型都必须一致。

看下面这个例子:

<?php
$num = array("a" => "5", "b" => 5, "c" => "5", "d" => "5");
print_r(array_search(5, $num, true));
?>

输出结果为:

b

因为开启了严格模式,只有键名"b"对应的值是整数5,其他几个虽然字符串内容是"5",但类型是字符串,不满足全等条件。

如果把strict改为false或者省略,结果会变成"a",因为松散比较下字符串"5"和整数5被认为是相等的,而"a"是第一个匹配项。

这里有一个项目实战中的踩坑经历。曾经在处理订单状态数组时,状态值用数字表示,但从前端表单接收到的数据是字符串。使用array_search()查找状态键名时,因为没有开启严格模式,字符串"0"和整数0发生了松散匹配,导致返回了错误的键名。后来统一开启严格模式,并配合类型转换,才避免了这类问题。

个人建议:在业务逻辑中,只要数组元素的类型是明确的,就应该开启严格模式。松散比较带来的便利远小于它带来的隐患。

四、松散比较的隐患与数组搜索边界

第四个例子展示了松散比较下字符串数字和整数数字的匹配情况:

<?php
$array = array(45, 5, 1, 22, 22, 10, 10);
$value = "10";
print_r(array_search($value, $array, false));
?>

输出结果为:

5

数组中有两个10,键名分别是5和6。array_search()返回第一个匹配的键名5。这里传入的$value是字符串"10",但因为strict为false,字符串"10"和整数10松散相等,所以能够匹配成功。

如果把strict改为true,这个搜索会返回false,因为字符串"10"和整数10类型不同。

这里还涉及一个边界问题:array_search()使用的是==松散比较,在PHP8之前,字符串和数字的比较规则有过多次调整。比如"abc"==0在旧版本中会返回true,PHP8之后行为发生了变化。虽然array_search()的内部比较不等同于用户空间的==,但类型混杂的数组仍然容易产生意外结果。

项目实战反思:如果数组中同时存在字符串和数字,并且没有开启严格模式,搜索结果可能不符合预期。比较稳妥的做法是,在搜索前对needle做类型规范化,或者直接使用严格模式。

五、array_search()与array_keys()的选择

当数组中存在多个相同值时,array_search()只返回第一个键名。如果需要获取所有匹配的键名,应该使用array_keys()并配合搜索值参数:

<?php
$array = array(45, 5, 1, 22, 22, 10, 10);
print_r(array_keys($array, 22));
?>

输出结果为:

Array ( [0] => 3 [1] => 4 )

array_keys()返回了所有值为22的键名。这是array_search()做不到的。

什么时候用array_search(),什么时候用array_keys()?如果只需要确认某个值是否存在并拿到第一个键名,array_search()更直接。如果需要收集所有匹配项,或者需要统计出现次数,array_keys()更合适。如果只是判断值是否存在,in_array()比array_search()更轻量,因为不需要返回键名。

个人见解:array_search()的返回值设计适合“找到一个就够”的场景。在配置映射、状态反查、权限标识定位等业务中,它比手动遍历数组更简洁。但不要因为它简洁就忽略严格模式,否则在类型不统一的数组里容易埋下隐患。

六、本节课程知识要点

  • array_search()用于在数组中搜索值,返回第一个匹配的键名,找不到返回false。

  • 第三个参数strict控制比较方式,false为松散比较,true为全等比较。

  • 判断搜索结果时使用!==false,避免键名0或空字符串被误判。

  • 多个相同值时只返回第一个键名,需要全部键名时使用array_keys()。

  • 业务代码中建议开启严格模式,减少类型混杂带来的意外匹配。

  • 只判断值是否存在时,in_array()比array_search()更合适。

  • 搜索前对needle做类型规范化,可以降低松散比较的风险。

array_search()不是一个复杂的函数,但它的严格模式参数和返回值判断是两个容易出错的地方。把这两个点处理好,它在数组搜索场景中就是一个可靠的工具。

← PHP rsort()函数:数组降序排序的实战教程 PHP array_shift()函数教程:移除数组首元素与键名重建实战 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号