本文介绍如何将 php 关联数组按 `date` 字段分组,并对每个日期组随机抽取 2 条记录,适用于内容轮播、抽奖展示或去重随机推荐等场景。
在实际开发中,常需从时间维度组织的数据中实现“每日期限内随机展示固定数量条目”的需求(例如每日精选 2 条动态、每组日期随机推送 2 篇文章)。本文提供一种简洁、健壮且可扩展的 PHP 实现方案,核心步骤包括:提取唯一日期 → 按日期过滤分组 → 组内随机打乱 → 截取前 N 条。
'1020', 'date' => 'Friday March 15'],
['id' => '1028', 'date' => 'Friday March 15'],
['id' => '1023', 'date' => 'Friday March 15'],
['id' => '1021', 'date' => 'Friday March 15'],
['id' => '1023', 'date' => 'Friday March 16'],
['id' => '1028', 'date' => 'Friday March 16'],
['id' => '1022', 'date' => 'Friday March 16'],
['id' => '1028', 'date' => 'Friday March 17'],
['id' => '1022', 'date' => 'Friday March 17'],
['id' => '1021', 'date' => 'Friday March 17'],
['id' => '1023', 'date' => 'Friday March 17'],
];
// 步骤 1:获取所有唯一日期
$dates = array_unique(array_column($array, 'date'));
// 步骤 2:为每个日期提取对应项,随机打乱并取前 2 条
$result = [];
foreach ($dates as $date) {
// 过滤出当前日期的所有记录(保持原始结构)
$items = array_filter($array, fn($item) => $item['date'] === $date);
// 重置键以确保索引连续(重要!否则 shuffle 后可能缺失 [0]/[1])
$items = array_values($items);
// 随机打乱
shuffle($items);
// 取前 2 条(自动处理不足 2 条的情况:可用 array_slice($items, 0, 2) 更安全)
$result[] = array_slice($items, 0, 2);
}
print_r($result);
?>? 输出示例(每次执行结果不同):Array ( [0] => Array ( [0] => Array([id] => '1020', [date] => 'Friday March 15') [1] => Array([id] => '1023', [date] => 'Friday March 15') ) [1] => Array ( [0] => Array([id] => '1022', [date] => 'Friday March 16') [1] => Array([id] => '1023', [date] => 'Friday March 16') ) [2] => Array ( [0] => Array([id] => '1021', [date] => 'Friday March 17') [1] => Array([id] => '1028', [date] => 'Friday March 17') ) )
$items = array_filter($array, function($item) use ($date) {
return $item['date'] === $date;
});
若需按日期字符串作为数组键(如 'Friday March 15' => [...]),可结合 array_flip 与 array_walk:
$result = [];
$dates = array_unique(array_column($array, 'date'));
foreach ($dates as $date) {
$group = array_values(array_filter($array, fn($i) => $i['date'] === $date));
shuffle($group);
$result[$date] = array_slice($group, 0, 2);
}
// $result 现为 ['Friday March 15' => [...], ...]该方案逻辑直观、无第三方依赖、易于调试与维护,是 PHP 中实现「按字段分组 + 组内随机采样」的经典范式。