想知道一个值在不在数组里?in_array()就是干这个的。它遍历数组,找到匹配的值就返回true,找不到返回false。
可以理解成:$needle(针)在不在$haystack(草垛)里。这个函数从PHP 4.0就有了。
语法格式
bool in_array(mixed $needle, array $haystack, bool $strict = false): bool
参数说明:
| 参数 | 说明 | 必填? |
|---|---|---|
| needle | 要搜索的值 | 必填 |
| haystack | 被搜索的数组 | 必填 |
| strict | 是否严格比较类型(true时要求值和类型都相同) | 可选,默认false |
返回值: 找到返回true,否则返回false。
示例1:基础用法
<?php
$student_ids = ["code001", "code002", "code003", "code004"];
if (in_array("code003", $student_ids)) {
echo "学生code003存在\n";
} else {
echo "学生code003不存在\n";
}
if (in_array("code999", $student_ids)) {
echo "学生code999存在\n";
} else {
echo "学生code999不存在\n";
}
?>
输出:
学生code003存在
学生code999不存在
示例2:严格模式与非严格模式的区别
<?php
$scores = [85, 92, 78, "100", 88];
// 非严格模式(默认)
if (in_array("100", $scores)) {
echo "非严格模式:找到了'100'(字符串)\n";
}
// 严格模式
if (in_array("100", $scores, true)) {
echo "严格模式:找到了'100'\n";
} else {
echo "严格模式:没找到'100',因为类型不匹配\n";
}
// 检查整数100是否存在
if (in_array(100, $scores, true)) {
echo "整数100存在\n";
} else {
echo "整数100不存在\n";
}
?>
输出:
非严格模式:找到了'100'(字符串)
严格模式:没找到'100',因为类型不匹配
整数100不存在
非严格模式下,字符串"100"和整数100被当成相等;严格模式下必须类型也相同。
示例3:查找多个值
<?php
$fruits = ["苹果", "香蕉", "橙子", "葡萄", "西瓜"];
$wanted = ["香蕉", "芒果", "葡萄"];
foreach ($wanted as $fruit) {
if (in_array($fruit, $fruits)) {
echo "找到了:{$fruit}\n";
} else {
echo "没找到:{$fruit}\n";
}
}
?>
输出:
找到了:香蕉
没找到:芒果
找到了:葡萄
个人经验分享
-
什么时候用严格模式?
-
数组包含混合类型(整数和字符串)
-
需要精确匹配,避免类型转换带来的误判
-
数据来自用户输入(通常是字符串),要和数据库里的整数ID比较时,很好用严格模式
-
-
性能方面
in_array()会遍历整个数组直到找到匹配的值。最坏情况下需要扫描全部元素,时间复杂度O(n)。如果需要频繁查找同一个数组,建议用
array_flip()转换成键名数组,然后用isset()查找,后者是O(1):// 慢(多次调用) if (in_array($value, $big_array)) { ... } // 快(翻转后用isset) $lookup = array_flip($big_array); if (isset($lookup[$value])) { ... } -
查找开销对比
对一个10万元素的数组做1万次查找:-
in_array():每次都要遍历,非常慢 -
isset():基本是瞬间完成
所以如果数据量大且查找频繁,提前建索引很值得。
-
-
和array_search()的区别
-
in_array():返回布尔值(有没有找到) -
array_search():返回找到的键名(没找到返回false)
如果需要知道位置,用
array_search()。 -
示例4:代码号学习编程场景
<?php
// 场景:会员资格验证
$vip_members = ["code001", "code003", "code005", "code007", "code009"];
function is_vip($user_id, $vip_list) {
return in_array($user_id, $vip_list);
}
$test_users = ["code001", "code002", "code005", "code010"];
foreach ($test_users as $uid) {
$status = is_vip($uid, $vip_members) ? "VIP会员" : "普通会员";
echo "{$uid}:{$status}\n";
}
?>
输出:
code001:VIP会员
code002:普通会员
code005:VIP会员
code010:普通会员
示例5:多维数组中查找
<?php
$products = [
["id" => 101, "name" => "机械键盘", "price" => 299],
["id" => 102, "name" => "游戏鼠标", "price" => 89],
["id" => 103, "name" => "显示器", "price" => 1250]
];
// 检查某个产品是否存在(按ID)
function product_exists($id, $products) {
foreach ($products as $product) {
if (in_array($id, $product)) {
return true;
}
}
return false;
}
// 检查产品名是否存在
function product_name_exists($name, $products) {
foreach ($products as $product) {
if (in_array($name, $product)) {
return true;
}
}
return false;
}
echo "ID 102存在吗?" . (product_exists(102, $products) ? "是" : "否") . "\n";
echo "ID 999存在吗?" . (product_exists(999, $products) ? "是" : "否") . "\n";
echo "产品'显示器'存在吗?" . (product_name_exists("显示器", $products) ? "是" : "否") . "\n";
?>
输出:
ID 102存在吗?是
ID 999存在吗?否
产品'显示器'存在吗?是
注意:in_array()默认不会递归搜索多维数组。上面的例子用了循环配合in_array(),也可以改用array_column()先提取一列。
示例6:严格模式的必要性演示
<?php
$data = [0, 1, 2, "3", 4, false];
// 非严格模式 - 容易误判
if (in_array("0", $data)) {
echo "非严格:找到了'0'(实际上数组里是整数0)\n";
}
if (in_array("false", $data)) {
echo "非严格:找到了'false'\n";
} else {
echo "非严格:没找到'false'字符串\n";
}
// 严格模式 - 精确匹配
if (in_array("0", $data, true)) {
echo "严格:找到了'0'\n";
} else {
echo "严格:没找到'0',因为类型不匹配\n";
}
?>
输出:
非严格:找到了'0'(实际上数组里是整数0)
非严格:没找到'false'字符串
严格:没找到'0',因为类型不匹配
本节课程知识要点
-
in_array()检查一个值是否存在于数组中 -
三个参数:要查找的值、目标数组、是否严格比较类型
-
默认非严格模式:整数和字符串会相互转换后比较
-
严格模式(第三个参数true):值和类型都必须相同
-
返回布尔值:存在true,否则false
-
频繁查找大数组时,用
array_flip()加isset()效率更高 -
从PHP 4.0开始可用