- Получите уникальные идентификаторы из обоих массивов.
- Рассчитайте их разницу (элементы, которых нет в обоих).
- Отфильтруйте исходные массивы по элементам, которые находятся в diff.
Вот пример для PHP 5.3 +:
$uniqueIds1 = array_map(function ($item) { return $item['unique_id']; }, $array1);
$uniqueIds2 = array_map(function ($item) { return $item['unique_id']; }, $array2);
$reallyUniqueIds = array_merge(array_diff($uniqueIds1, $uniqueIds2), array_diff($uniqueIds2, $uniqueIds1));
$filteredArray1 = array_filter($array1, function ($item) use ($reallyUniqueIds) {
return in_array($item['unique_id'], $reallyUniqueIds);
});
$filteredArray2 = array_filter($array2, function ($item) use ($reallyUniqueIds) {
return in_array($item['unique_id'], $reallyUniqueIds);
});
Объяснение:
array_map(function ($item) { return $item['unique_id']; }, $array1)
Это просто извлекает все значения unique_id
вмассив типа array('banana', 'apple', ...)
.
array_merge(array_diff($uniqueIds1, $uniqueIds2), array_diff($uniqueIds2, $uniqueIds1));
Это создает различия между массивами в обе стороны и объединяет их в один массив, например:
array('banana', 'apple')
array('strawberry', 'apple')
-> array('banana', 'strawberry')
См. array_diff
.
Затем, наконец, снова проходят исходные массивы, чтобы отфильтровать все элементы, которых unique_key
нет в массиве, который мы создали на предыдущем шаге:
array_filter($array1, function ($item) use ($reallyUniqueIds) {
return in_array($item['unique_id'], $reallyUniqueIds);
})
Это просто использует пользовательскую функцию обратного вызова для array_filter
, которая говорит ей фильтровать элементы, где in_array($item['unique_id'], $reallyUniqueIds)
равно false
.