PHP如何按相同索引对比多维内层数组元素并处理差异数据
同索引位置对比多维数组差异的PHP实现方案
你之前用array_diff的逻辑无法匹配需求是因为array_diff仅对比值是否存在,不会校验值对应的索引位置是否一致。以下是符合要求的实现代码:
$fieldLanguages = [2,5]; $questionsByLanguageIds = [ 2 =>[ 0 => 2439, 1 => 2435, 2 => 2450, ], 5 => [ 0 => 2440, 1 => 2435, 2 => 2451, ] ]; // 取第一个语言分组为对比基准 $baseLangId = reset($fieldLanguages); $baseList = $questionsByLanguageIds[$baseLangId]; $toDeleteIds = []; // 遍历所有非基准的语言分组 foreach ($fieldLanguages as $langId) { if ($langId == $baseLangId) { continue; } $currentList = $questionsByLanguageIds[$langId] ?? []; // 遍历所有索引位置做精准对比 foreach ($baseList as $index => $baseVal) { // 当前分组该索引无值跳过,有值且和基准不同则加入删除列表 if (isset($currentList[$index]) && $currentList[$index] !== $baseVal) { $toDeleteIds[] = $currentList[$index]; } } // 额外处理当前分组比基准分组长的情况,多出来的索引对应的ID全部删除 $currentLen = count($currentList); $baseLen = count($baseList); if ($currentLen > $baseLen) { for ($i = $baseLen; $i < $currentLen; $i++) { $toDeleteIds[] = $currentList[$i]; } } } // 去重后批量删除数据库记录 $toDeleteIds = array_unique($toDeleteIds); if (!empty($toDeleteIds)) { // 此处替换为你的实际数据库删除逻辑即可 // 示例:mysqli_query($conn, "DELETE FROM questions WHERE id IN (".implode(',', $toDeleteIds).")"); }
逻辑说明
- 严格按照同索引位置对比的规则执行,仅以第一个语言分组的值为基准
- 兼容不同语言分组长度不一致的边界场景,其他分组超出基准长度的题目ID也会被标记删除
- 收集完所有待删除ID后统一去重批量删除,比单次循环删除性能更高
内容的提问来源于stack exchange,提问作者George Vladimir
相关产品推荐
相关产品推荐

