PHP数组处理:移除原始数组中未在所有子数组存在的ID求助
问题:筛选原始数组中存在于所有子数组的ID
需求:从原始ID数组$origialArr中移除那些未在所有子数组中存在的ID,仅保留在$arr的每一个子数组里都出现过的ID。
给定数组
$origialArr = [4883,8438,8468,4001,8577]; $arr = [ [8438,8468,4001,8577], [4883,8438,8468,4001,8577], [4883,8468,4001,8577], [4883,8438,8468,4001,8577], [4883,8438,8468,4001,8577], ];
无效尝试代码
// attempt 1 $arr1 = []; foreach ($arr as $item) { $arr1[] = array_intersect($origialArr, $item); } // attempt 2 $anotherArr = []; foreach ($arr as $item) { foreach ($item as $id) { $anotherArr[] = array_filter($origialArr, function($origArr) use ($id) { if ($id === $origArr) { return $id; } }); } }
解决方案
方法一:逐步求所有子数组的交集
先以第一个子数组为初始交集,再依次和后续每个子数组求交集,最后确保结果仅包含原始数组中的元素:
$origialArr = [4883,8438,8468,4001,8577]; $arr = [ [8438,8468,4001,8577], [4883,8438,8468,4001,8577], [4883,8468,4001,8577], [4883,8438,8468,4001,8577], [4883,8438,8468,4001,8577], ]; // 初始化公共ID集合为第一个子数组 $commonIds = $arr[0]; // 遍历剩余子数组,逐步缩小公共ID范围 foreach (array_slice($arr, 1) as $subArr) { $commonIds = array_intersect($commonIds, $subArr); } // 仅保留原始数组中存在的公共ID,并重置索引 $result = array_values(array_intersect($origialArr, $commonIds)); print_r($result); // 输出:Array ( [0] => 8468 [1] => 4001 [2] => 8577 )
方法二:遍历原始数组元素逐一校验
遍历原始数组的每个ID,检查它是否存在于所有子数组中:
$origialArr = [4883,8438,8468,4001,8577]; $arr = [ [8438,8468,4001,8577], [4883,8438,8468,4001,8577], [4883,8468,4001,8577], [4883,8438,8468,4001,8577], [4883,8438,8468,4001,8577], ]; $result = []; foreach ($origialArr as $id) { $existsInAll = true; // 检查当前ID是否在所有子数组中存在 foreach ($arr as $subArr) { if (!in_array($id, $subArr)) { $existsInAll = false; break; } } if ($existsInAll) { $result[] = $id; } } print_r($result); // 输出:Array ( [0] => 8468 [1] => 4001 [2] => 8577 )
错误分析
- 尝试1:仅将原始数组与每个子数组的交集存入新数组,未进一步求这些交集的公共部分,因此无法得到全局符合条件的ID。
- 尝试2:嵌套循环中反复调用
array_filter生成零散数组,逻辑混乱,没有筛选出同时存在于所有子数组的元素。
内容的提问来源于stack exchange,提问作者the_lorem_ipsum_guy
相关产品推荐
相关产品推荐

