改组以保持Laravel中的相似元素

时间:2019-05-21 11:18:51

标签: php laravel

我有一个收藏集

$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,而不是对每个问题进行改组,而是对主题进行改组。就像以随机顺序显示所有数学问题,然后以随机顺序显示物理问题一样,依此类推。主题可以按任意顺序拖移,但问题不应拖拉,例如首先显示一个能力问题,然后显示另一个英语问题,依此类推。 应该按照这样或以任何顺序显示,但要取决于主题。

[
{
    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 个答案:

答案 0 :(得分:1)

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

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

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

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

shuffle()将改组上述集合。

flatten(1)将删除分组级别,为您提供按随机主题分组的扁平问题列表。参数1的意思是“仅展平一个级别”;如果您忽略将得到奇怪的结果。