Laravel中如何实现用户数组与地点数组的随机匹配?
用户与地点集合的随机匹配实现方案
需求说明
现有两个数据结构:用户数组,以及Illuminate\Support\Collection类型的地点集合,需要将两者进行随机匹配,生成包含user_id和location_id的结构化数组。
原数据结构
地点集合
Illuminate\Support\Collection {#4291 ▼ #items: array:20 [▼ 0 => {#4312 ▶} 1 => {#4318 ▶} 2 => {#4313 ▶} 3 => {#4315 ▶} 4 => {#4316 ▶} 5 => {#4319 ▶} 6 => {#4320 ▶} 7 => {#4321 ▶} 8 => {#4322 ▶} 9 => {#4323 ▶} 10 => {#4324 ▶} 11 => {#4325 ▶} 12 => {#4326 ▶} 13 => {#4327 ▶} 14 => {#4328 ▶} 15 => {#4329 ▶} 16 => {#4330 ▶} 17 => {#4331 ▶} 18 => {#4332 ▶} 19 => {#4333 ▼ +"business_location_id": 46 +"business_location_name": "Khan El-Moaz" } ] }
用户数组
array:2 [▼ 167 => "167" 199 => "199" ]
实现代码
以下是基于Laravel框架的实现方案,可直接复用:
// 替换为你的实际变量 $locations = /* 你的地点Collection实例 */; $users = /* 你的用户数组 */; // 提取所有地点ID并打乱顺序,实现随机化 $shuffledLocationIds = $locations->pluck('business_location_id')->shuffle()->toArray(); $matches = []; foreach ($users as $userId) { // 若地点ID耗尽,重新打乱补充(可选逻辑,按需开启) if (empty($shuffledLocationIds)) { $shuffledLocationIds = $locations->pluck('business_location_id')->shuffle()->toArray(); } // 生成匹配项,转换为字符串格式 $matches[] = [ 'user_id' => (string)$userId, 'location_id' => (string)array_pop($shuffledLocationIds) ]; } // 如需添加额外用户的匹配(如示例中的150),可单独处理 // $extraUserId = '150'; // $matches[] = [ // 'user_id' => $extraUserId, // 'location_id' => (string)$locations->random()->business_location_id // ]; // 查看最终匹配结果 dd($matches);
代码说明
pluck('business_location_id'):从地点集合中提取所有地点ID,生成仅包含ID的新Collectionshuffle():打乱集合元素顺序,保证匹配的随机性- 遍历用户数组时,每次从打乱的ID数组末尾取出一个ID分配给用户;若ID耗尽,可重新打乱地点ID数组循环使用(根据业务需求决定是否允许地点重复分配)
- 最终生成的
$matches数组完全符合要求的输出格式
内容的提问来源于stack exchange,提问作者fionka
相关产品推荐
相关产品推荐

