PHP多维数组去重:筛选值唯一的问题ID数组
处理多维数组标签去重并筛选10个唯一项
嘿,这个需求我太熟了,咱们一步步来搞定它:
核心思路
首先得把标签数组完全相同的项合并掉,只保留一个对应的问题ID,然后从去重后的结果里挑出10个就行。这里用PHP实现的话,核心是把标签数组转换成唯一的字符串键,利用数组键的唯一性自动去重。
代码实现
第一步:去重处理
假设你的原始数组是类似这样的结构:
$originalArray = [ 1 => ['php', 'array', 'duplicate'], 2 => ['php', 'array', 'duplicate'], // 和ID1的标签完全一致,会被剔除 3 => ['javascript', 'dom'], 4 => ['css', 'layout'], // ... 剩下的30+项 ];
然后执行去重逻辑:
$uniqueTagMap = []; foreach ($originalArray as $questionId => $tags) { // 👉 注意:如果标签顺序不同但内容相同也算重复,先给标签排序 // sort($tags); // 把标签数组转成唯一字符串作为键(选个标签里不会出现的分隔符,比如|) $tagKey = implode('|', $tags); // 只保留第一个出现的该标签组合的问题ID if (!isset($uniqueTagMap[$tagKey])) { $uniqueTagMap[$tagKey] = $questionId; } } // 把去重后的结果转回原数组格式:问题ID => 标签数组 $dedupedArray = []; foreach ($uniqueTagMap as $questionId) { $dedupedArray[$questionId] = $originalArray[$questionId]; }
第二步:筛选10个项
去重后如果数量≥10,直接取前10个(保留原问题ID):
// 取前10个标签唯一的项 $finalResult = array_slice($dedupedArray, 0, 10, true);
如果想要随机选10个,换成这段代码:
// 随机选10个问题ID $randomQuestionIds = array_rand($dedupedArray, 10); $finalResult = []; foreach ($randomQuestionIds as $id) { $finalResult[$id] = $dedupedArray[$id]; }
关键细节提醒
- 关于标签顺序:如果你的需求里,
['a','b']和['b','a']算相同标签组合,记得打开代码里的sort($tags)注释,先排序再生成唯一键。 - 分隔符选择:一定要选标签里绝对不会出现的字符,避免不同标签组合生成相同的键(比如标签里有逗号就别用逗号当分隔符)。
内容的提问来源于stack exchange,提问作者Robert Moritz
相关产品推荐
相关产品推荐

