У меня есть массив с некоторыми учениками, которые поступили на курс. Существует несколько дубликатов, и для каждого курса должен быть только один ученик.Как найти несколько дубликатов в ответе PodioItemCollection?
Пример массива:
'item_id'=> 1, 'student'=> 'Bob', 'course'=> 'Learn Piano', 'address'=>''
'item_id'=> 2, 'student'=> 'Sam', 'course'=> 'Learn Piano', 'address'=> 'foo street'
'item_id'=> 3, 'student'=> 'Bob', 'course'=> 'Learn Guitar', 'address'=>''
'item_id'=> 4, 'student'=> 'Sam', 'course'=> 'Learn Piano', 'address'=>''
'item_id'=> 5, 'student'=> 'Bob', 'course'=> 'Learn Guitar', 'address'=> 'bla bla street'
'item_id'=> 6, 'student'=> 'Sam', 'course'=> 'Learn Piano', 'address'=>''
'item_id'=> 7, 'student'=> 'John', 'course'=> 'Learn Guitar', 'address'=>''
Данные доступны через API (в противном случае вся эта вещь будет простой SQL-запрос!).
Необработанные данные выглядят следующим образом:
object(PodioItemCollection)#287 (5) { ["filtered"]=> int(45639) ["total"]=> int(45639) ["items"]=> NULL ["__items":"PodioCollection":private]=> array(10) { [0]=> object(PodioItem)#3 (5) { ["__attributes":"PodioObject":private]=> array(16) { ["item_id"]=> int(319357433) ["external_id"]=> NULL ["title"]=> string(12) "Foo Bar" ["link"]=> string(71) "https://podio.com/foo/enrolments/apps/applications/items/123" ["rights"]=> array(11) ...
Задача состоит в том, что я не могу просто использовать array_unique или подобные, потому что мне нужно:
- Найти все дубликаты для студента + курс
- Оценить найденные дубликаты друг против друга и сохранить элемент с наибольшим количеством дополнительной информации (или слить их)
- Получить un -двойный «item_id» для дубликатов и использовать API для удаления элементов.
Дополнительные ограничения:
- Я не имею никакого контроля над API.
- Есть 44000 записей
- Там может быть больше, чем 100 дубликатов на человек + курс
- API-интерфейс возвращает вложенную иерархию объектов, поэтому 44000 записей используют 27GB оперативной памяти (сервер имеет 144GB играть с) и да, предел php_memory установлен на нелепый уровень !!! Это единый проект, и после этого будут приняты значения .
- Из-за большого использования RAM вещи, такие как array_intersect будут менее популярным
Конечный результат должен быть:
'item_id'=> 1, 'student'=> 'Bob', 'course'=> 'Learn Piano', 'address'=>''
'item_id'=> 2, 'student'=> 'Sam', 'course'=> 'Learn Piano', 'address'=> 'foo street'
'item_id'=> 5, 'student'=> 'Bob', 'course'=> 'Learn Guitar', 'address'=> 'bla bla street'
'item_id'=> 7, 'student'=> 'John', 'course'=> 'Learn Guitar', 'address'=>''
Но я также нужен доступ к «item_id на 3-х, 4,6, поэтому я могу вызвать процедуру удаления через API.
Любые идеи, как решить эту проблему с несколькими дубликатами?
Использование 'array_unique' – aldrin27
Извините, но это не будет работать. Мне нужно найти дубликаты с наибольшей информацией, а затем сгенерировать список элементов, которые я не хочу, чтобы их удалить. – Rucia
Использовать 'if statements' – aldrin27