PHP中如何判断一个数组的所有元素都包含在另一个数组中
问题排查与解决方案
1. 数组定义语法错误
你给出的示例数组中GHI没有添加单/双引号,PHP会将未定义的裸词默认识别为字符串,但会抛出Notice级别的报错,若生产环境关闭了Notice提示,可能出现常量值与预期字符串不匹配的情况,导致元素匹配失败,先修正数组定义:
// 修正后的数组定义 $items = ['ABC', 'DEF', 'GHI']; $array1 = ['ABC', 'DEF', 'GHI']; $array2 = ['DEF'];
2. 原有代码逻辑验证
你写的!array_diff($items, $array1)逻辑本身是符合要求的:array_diff($a, $b)会返回所有在$a中存在、但在$b中不存在的元素,若返回空数组则说明$a的所有元素都在$b中,空数组转布尔值为false,取反后得到true。你没有得到正确结果大概率是上述的数组语法错误,或者写反了array_diff的两个参数顺序。
另外你写的$result = array_intersect($items,$array1);属于冗余代码,后续你已经重新给$result赋值,不会影响最终结果,可以直接删除。
3. 优化实现方案
基础实现(小数组场景)
直接基于array_diff封装成可复用函数:
function checkAllElementsExist(array $items, array $target): bool { return empty(array_diff($items, $target)); }
测试结果:
var_dump(checkAllElementsExist($items, $array1)); // bool(true) var_dump(checkAllElementsExist($items, $array2)); // bool(false)
高性能实现(大数组场景)
当数组元素较多时,array_diff的时间复杂度较高,可通过哈希表映射实现O(n)级别的判断:
function checkAllElementsExist(array $items, array $target): bool { // 将目标数组转换为 元素值=>索引 的哈希表 $targetHash = array_flip($target); foreach ($items as $item) { // 只要有一个元素不存在就直接返回false if (!isset($targetHash[$item])) { return false; } } return true; }
内容的提问来源于stack exchange,提问作者mxr10
相关产品推荐
相关产品推荐

