Если я вас правильно понял, я бы предложил что-то вроде этого:
$old_ids = array();
foreach ($old as $row) {
$old_ids[$row['id']] = $row;
}
$new_ids = array();
foreach ($new as $row) {
$new_ids[$row['id']] = $row;
}
$insert = array_diff_key($new_ids, $old_ids);
//^^^Returns all records of $new_ids that aren't present in $old_ids
$update = array_intersect_key($new_ids, $old_ids);
//^^^Returns all records of $new_ids that were present in $old_ids
$delete = array_diff_key($old_ids, $new_keys);
//^^^Returns all records of $old_ids that aren't present in $new_ids
Теперь у вас есть 3 массива со всеми данными, и я думаю, что имена ясно говорят, что с ними делать. Просто имейте в виду, что эти функции возвращают данные своих первых аргументов, поэтому
array_intersect_key($new_ids, $old_ids) != array_intersect_key($old_ids, $new_ids)
как array_intersect_key($new_ids, $old_ids)
вернет новые данные, а array_intersect_key($old_ids, $new_ids)
вернет старые данные, и вам придется снова искать новые значения. Не путайте аргументы по порядку.