← PHP中的array_flip():交换数组的键和值 PHP中的array_intersect_assoc():带键名检查的数组交集 →

PHP中的in_array():检查数组中是否存在某个值

原创 2026-05-22 PHP 已有人查阅

想知道一个值在不在数组里?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";
    }
}
?>

输出:

找到了:香蕉
没找到:芒果
找到了:葡萄

个人经验分享

  1. 什么时候用严格模式?

    • 数组包含混合类型(整数和字符串)

    • 需要精确匹配,避免类型转换带来的误判

    • 数据来自用户输入(通常是字符串),要和数据库里的整数ID比较时,很好用严格模式

  2. 性能方面
    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])) { ... }
  3. 查找开销对比
    对一个10万元素的数组做1万次查找:

    • in_array():每次都要遍历,非常慢

    • isset():基本是瞬间完成
      所以如果数据量大且查找频繁,提前建索引很值得。

  4. 和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开始可用

← PHP中的array_flip():交换数组的键和值 PHP中的array_intersect_assoc():带键名检查的数组交集 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号