如何移除PHP大数组中与指定数组值匹配的子数组?
问题描述
我有一个名为$roster的数组,包含约16个子数组(以下仅展示4个示例):
Array ( [0] => Array ( [playerid] => 1055 [firstname] => Christian [lastname] => McCaffrey [age] => 27 ) [1] => Array ( [playerid] => 1362 [firstname] => A.J. [lastname] => Brown [age] => 26 ) [2] => Array ( [playerid] => 1897 [firstname] => Joe [lastname] => Burrow [age] => 27 ) [3] => Array ( [playerid] => 2019 [firstname] => De'Von [lastname] => Achane [age] => 22 ) )
还有一个仅包含playerid的独立数组$notneeded:
Array ( [0] => 1055 [1] => 1495 [2] => 1497 [3] => 1897 [4] => 1775 )
我需要遍历数组,移除$roster中playerid存在于$notneeded里的子数组,最终$roster应只剩2个子数组。
但我尝试以下代码后,没有任何元素被移除:
foreach ($notneeded as $item) { // Search values and remove them from $roster if(($key = array_search($item, $roster)) !== false) { unset($roster[$key]); } }
错误原因
array_search($item, $roster)的作用是在$roster中查找完全等于$item的元素,但$roster的每个元素都是子数组,而$item是单个数字,两者类型和内容都不匹配,所以永远找不到匹配项,自然不会执行unset操作。
解决方案
这里提供几种简洁高效的实现方式:
方法1:使用array_filter(推荐)
利用array_filter过滤掉不符合条件的子数组,代码简洁且可读性高:
$notneededSet = array_flip($notneeded); // 转成键为playerid的数组,提升查找效率 $roster = array_filter($roster, function($player) use ($notneededSet) { // 保留playerid不在$notneededSet中的元素 return !isset($notneededSet[$player['playerid']]); }); // 可选:如果需要重置数组索引(从0开始连续编号) $roster = array_values($roster);
- 先把
$notneeded转成键为playerid的数组,这样isset的查找时间复杂度是O(1),比in_array的O(n)更高效。 array_filter会遍历$roster,只保留返回值为true的元素。
方法2:遍历$roster并删除匹配项
如果你习惯用循环的方式,可以直接遍历$roster的键值对,判断后删除:
$notneededSet = array_flip($notneeded); foreach ($roster as $key => $player) { if (isset($notneededSet[$player['playerid']])) { unset($roster[$key]); } } // 可选:重置索引 $roster = array_values($roster);
方法3:先提取$roster的playerid数组再匹配
先从$roster中提取所有playerid到一个数组,再用array_diff找到需要保留的playerid,最后过滤:
$rosterPlayerIds = array_column($roster, 'playerid'); $keepPlayerIds = array_diff($rosterPlayerIds, $notneeded); $roster = array_filter($roster, function($player) use ($keepPlayerIds) { return in_array($player['playerid'], $keepPlayerIds); }); // 可选:重置索引 $roster = array_values($roster);
内容的提问来源于stack exchange,提问作者user3304303
相关产品推荐
相关产品推荐

