为了账号安全,请及时绑定邮箱和手机立即绑定

Shuffle 保持 Laravel 中的相似元素

Shuffle 保持 Laravel 中的相似元素

PHP
湖上湖 2021-06-28 17:55:00
我有一个收藏$questions = ExaminationQuestion::where('question_set_id', $set->id)                               ->where('marks', array_flip($marks)['2 Marks'])                               ->inRandomOrder()                               ->get();它的科目能力、化学、数学、英语、物理存储为 0、1、2、3、4。[{    id: 1,    question_set_id: 1,    subject: 0,},{    id: 2,    question_set_id: 1,    subject: 0,},{    id: 1,    question_set_id: 1,    subject: 1,},{    id: 2,    question_set_id: 1,    subject: 1,},{    id: 1,    question_set_id: 1,    subject: 2,},{    id: 2,    question_set_id: 1,    subject: 2,},{    id: 1,    question_set_id: 1,    subject: 3,},{    id: 2,    question_set_id: 1,    subject: 3,},{    id: 2,    question_set_id: 1,    subject: 4,},{    id: 2,    question_set_id: 1,    subject: 4,},]我想通过不改组每个问题而是改组主题来以随机顺序显示 $questions 。就像以随机顺序显示所有数学问题然后以随机顺序显示所有物理问题等等。科目可以按任何顺序随机排列,但问题不应该像先显示一个 Aptitude 问题然后显示另一个英语问题那样随机排列。它应该像这样或以任何顺序显示,但要根据主题。[{    id: 1,    question_set_id: 1,    subject: 3,},{    id: 2,    question_set_id: 1,    subject: 3,},{    id: 1,    question_set_id: 1,    subject: 2,},{    id: 2,    question_set_id: 1,    subject: 2,},{    id: 1,    question_set_id: 1,    subject: 0,},{    id: 2,    question_set_id: 1,    subject: 0,},{    id: 1,    question_set_id: 1,    subject: 4,},{    id: 2,    question_set_id: 1,    subject: 4,},{    id: 2,    question_set_id: 1,    subject: 1,},{    id: 2,    question_set_id: 1,    subject: 1,},]
查看完整描述

1 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

Laravel 的集合允许你使用一些辅助方法来做到这一点:


$questions->groupBy('subject')->shuffle()->flatten(1);

groupBy('subject') 将为您提供类似于以下内容的 2d 集合:


[

  subject id => [question, question, ...],

  subject id => [question, question, ...],

  ..

]

shuffle() 将洗牌上述集合。


flatten(1)将删除分组级别,为您提供按随机主题分组的问题的平面列表。该参数的1意思是“只压平一层”;如果你忽略它,你会得到奇怪的结果。


查看完整回答
反对 回复 2021-07-02
  • 1 回答
  • 0 关注
  • 138 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信