数组比对与元素移除:匹配两数组并删除Array 1中匹配的键值对
解决数组匹配并移除匹配项的问题
嘿,这问题我熟!你要做的就是把Array 1里所有值和Array 2匹配的键值对删掉对吧?先把你的数组结构理清楚,方便咱们写代码示例:
你的数组示例
Array 1(注意键3是缺失的):
$array1 = [ 0 => 1, 1 => 2, 2 => 3, 4 => 5, 5 => 8, 6 => 9, 7 => 10, 8 => 11, 9 => 12, 10 => 15, 11 => 16, 12 => 17, 13 => 18, 14 => 19, 15 => 22, 16 => 23, 17 => 24, 18 => 25, 19 => 26, 20 => 29, 21 => 30, 22 => 31 ];
Array 2(值为带前导零的字符串,如01、02):
$array2 = [ 0 => '01', 1 => '02', 2 => '03', 3 => '04', // ... 其他后续值 ];
关键注意点
首先得明确:值的类型是否需要严格匹配?比如Array 1的数字1和Array 2的字符串'01'算不算匹配?
- 宽松匹配:只看数值相等,忽略类型差异
- 严格匹配:必须类型和值完全一致才判定为匹配
解法1:用array_filter简洁处理(PHP)
这是最省心的方式,利用数组过滤函数保留不匹配的项:
宽松匹配(忽略类型)
先把Array 2的值转成数字数组,再过滤Array 1:
// 将Array2的字符串值转为数字类型 $array2NumValues = array_map('intval', $array2); // 过滤Array1,只保留不在Array2值集合里的项 $filteredArray1 = array_filter($array1, function($value) use ($array2NumValues) { return !in_array($value, $array2NumValues); });
严格匹配(类型+值都要一致)
需要把Array 1的值转成字符串,再和Array 2的字符串值做严格比对:
// 过滤Array1,保留和Array2值不严格匹配的项 $filteredArray1 = array_filter($array1, function($value) use ($array2) { return !in_array((string)$value, $array2, true); });
解法2:循环遍历移除(更直观)
如果你喜欢直白的逻辑,可以逐个遍历Array 1的项,匹配到就移除:
$array2NumValues = array_map('intval', $array2); foreach ($array1 as $key => $value) { // 检查当前值是否在Array2的数值集合里 if (in_array($value, $array2NumValues)) { unset($array1[$key]); } } // 此时$array1就是移除匹配项后的结果
结果验证
假设Array 2包含'01'、'02'、'03',那么Array 1里键0、1、2对应的1、2、3会被移除,剩下的键4到22的项会保留下来。
内容的提问来源于stack exchange,提问作者Madhu Nair
相关产品推荐
相关产品推荐

