如何根据另一二维数组的匹配ID与active状态筛选目标数组条目?
解决方案
先预处理$comps,提取有效ID集合
先把$comps里所有status为active的条目挑出来,提取它们的c_id,转成和$rests里r_id一致的类型(这里$comps的c_id是字符串,$rests的r_id是数字,统一类型避免匹配出错):
// 筛选出active状态的组件ID,转成数字类型 $activeCompIds = array_map( fn($item) => (int)$item['c_id'], array_filter($comps, fn($item) => $item['status'] === 'active') );
过滤$rests数组
遍历$rests,只保留r_id在刚才提取的有效ID集合里的条目:
$filteredRests = array_filter($rests, function($restItem) use ($activeCompIds) { return in_array($restItem['r_id'], $activeCompIds); });
更简洁的合并写法
如果想少写几行,也可以把两步合并,用array_column直接提取有效ID:
$filteredRests = array_filter($rests, function($rest) { // 直接获取所有active状态的c_id(字符串类型) $activeIds = array_column(array_filter($comps, fn($c) => $c['status'] === 'active'), 'c_id'); // 把r_id转成字符串做匹配 return in_array((string)$rest['r_id'], $activeIds); });
为什么array_uintersect达不到预期?
array_uintersect是用来找两个数组的交集,但它默认对比的是数组元素本身。这里的元素是二维数组,你需要自定义非常复杂的比较函数,既要匹配c_id和r_id,还要同时判断status,不仅可读性差,还容易因为类型不匹配、逻辑遗漏出问题,完全没必要用这个函数处理这种场景。
内容的提问来源于stack exchange,提问作者physicsboy
相关产品推荐
相关产品推荐

