我有一些学生参加了课程。有多个重复,每门课程应该只有一个学生。
示例数组:
'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 或类似的,因为我需要:
- 查找学生 + 课程的所有重复项
- 相互评估找到的重复项并保留具有最多补充信息的项目(或合并它们)
- 获取重复项的不需要的“item_id”并使用 API 删除项目。
进一步的限制:
- 我无法控制 API。
- 有 44,000 条记录
- 每人 + 课程可能有多达 100 个重复项
- API 返回对象的嵌套层次结构,因此 44,000 条记录使用 27GB 的 RAM(服务器有 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's 3,4,6 以便我可以通过 API 调用删除例程。
任何想法如何解决这个多重重复的混乱?