PHP 2D array_diff / array_intersect для ВСТАВИТЬ / ОБНОВИТЬ / УДАЛИТЬ - PullRequest
0 голосов
/ 17 марта 2011

У меня есть пара двумерных массивов, соответствующих набору записей из базы данных.

Один массив содержит текущие записи, другой - новые записи.

Мне бы хотелось, чтобы элегантное универсальное решение сортировало эти массивы так, чтобы я знал, какие из новых записей добавлены в INSERT или UPDATE, а какие из текущих записей - в DELETE. Я уверен, что это должно быть обычное поведение, но ответ, который не требует большого количества циклов вложенных массивов, ускользает от меня.

Я думаю, что в идеале пересечение двумерного массива получило бы записи ОБНОВЛЕНИЯ, а двумерный массив - различие записей ВСТАВИТЬ / УДАЛИТЬ.

1 Ответ

3 голосов
/ 17 марта 2011

Если я вас правильно понял, я бы предложил что-то вроде этого:

$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) вернет старые данные, и вам придется снова искать новые значения. Не путайте аргументы по порядку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...