PHP 8.0+ 可用 array_filter() 配合 str_contains() 一行筛选含指定子串的字符串元素;PHP 7.x 应用 stripos() !== false 替代;多维数组需先取字段再判断,注意 isset() 防 Notice;性能敏感时避免正则与重复计算。

用 array_filter() 配合 str_contains() 筛选含指定字符串的元素
PHP 8.0+ 直接支持 str_contains(),它是判断字符串是否包含子串最安全的方式(不依赖大小写、不报警告、不触发类型转换)。搭配 array_filter() 可一行完成筛选:
php $items = ['apple pie', 'banana', 'cherry tart', 'blueberry']; $result = array_filter($items, fn($s) => str_contains($s, 'berry')); // → ['banana', 'cherry tart', 'blueberry']
注意:回调函数必须返回布尔值;array_filter() 默认保留原键名,如需重索引,包一层 array_values()。
PHP 7.x 怎么做?用 stripos() 替代 str_contains()
stripos() 是 PHP 7 兼容性最好的选择(忽略大小写,返回 int 或 false)。关键点在于显式判断 !== false,否则 '0' 开头的匹配会被误判为 false:
- ❌ 错误写法:
stripos($s, 'test')—— 若子串在开头,返回 0,被当成 false - ✅ 正确写法:
stripos($s, 'test') !== false
完整示例:
立即学习“PHP免费学习笔记(深入)”;
php
$items = ['Test drive', 'demo', 'TESTING'];
$result = array_filter($items, function($s) {
return stripos($s, 'test') !== false;
});
// → ['Test drive', 'TESTING']
筛选多维数组中某个字段含字符串的子数组
常见于从 $users 中找昵称含关键词的人。不能直接对整个子数组调用 str_contains(),必须先取字段值:
php
$users = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 3, 'name' => 'Charlie'],
];
$result = array_filter($users, fn($u) => str_contains($u['name'], 'a'));
// → ['id' => 1, 'name' => 'Alice'] 和 ['id' => 3, 'name' => 'Charlie']
隐患点:
- 若某些元素没有
name键,会触发Notice: Undefined index - 稳妥做法是先用
isset($u['name'])做守卫
性能敏感场景下避免重复计算或正则开销
如果要筛大量数据(如 >10k 条),注意两点:
-
preg_match()比str_contains()慢 3–5 倍,且无必要时别用正则 - 不要在回调里重复调用耗时操作(比如每次查数据库、解码 JSON)
- 如需多次按不同关键词筛选,考虑提前构建索引(例如把字符串转小写缓存到新字段)
一个容易被忽略的细节:array_filter() 不改变原数组,但若数组极大,生成新数组仍会吃内存 —— 真正超大集合建议用生成器或分批处理。











