如何移除一维数组中不存在于嵌套数组中的元素?
如何移除一维数组中不存在于嵌套数组中的元素?
看起来你已经找对了思路,但可以用更简洁、易维护的方式解决这个问题!你的现有代码虽然能实现需求,但如果后续嵌套数组的子数组数量增加,写一堆or in_array会变得很繁琐,扩展性也差。
优化方案:先扁平化嵌套数组
核心思路是先把嵌套的$arr_cls转换成一个一维数组,这样只需要一次检查就能判断元素是否存在,不用逐个遍历子数组:
// 将嵌套数组扁平化为一维数组 $all_valid_values = array_merge(...$arr_cls); // 可选:去重优化,减少后续in_array的检查次数 $all_valid_values = array_unique($all_valid_values); // 过滤$part_t2,只保留存在于有效列表中的元素 $part_t2_2 = array_filter($part_t2, function($value) use ($all_valid_values) { return in_array($value, $all_valid_values, true); });
代码解释
array_merge(...$arr_cls):利用PHP的可变参数特性,把$arr_cls里的所有子数组合并成一个一维数组,不管子数组数量有多少,这行代码都能适配。array_unique():去除一维数组里的重复值,虽然不影响最终的检查结果,但能减少后续in_array的比对次数,提升效率。array_filter():遍历$part_t2,用匿名函数判断每个元素是否在有效列表中,只保留符合条件的元素。
兼容低版本PHP(5.6以下)
如果你的PHP版本不支持可变参数,可以用array_reduce来扁平化数组:
$all_valid_values = array_reduce($arr_cls, function($carry, $sub_arr) { return array_merge($carry, $sub_arr); }, []);
关于你原有代码的说明
你的原有代码逻辑本身是正确的,如果没生效,大概率是字符串的大小写差异或者隐形空格导致的(比如"Sturm Graz"和数组中的值是否完全一致?)。不过还是推荐扁平化数组的方案,代码更简洁易维护。
备注:内容来源于stack exchange,提问作者Tony Poli
相关产品推荐
相关产品推荐

