Перемешивание, сохраняющее подобные элементы в laravel - PullRequest
1 голос
/ 21 мая 2019

У меня есть коллекция

$questions = ExaminationQuestion::where('question_set_id', $set->id)
                               ->where('marks', array_flip($marks)['2 Marks'])
                               ->inRandomOrder()
                               ->get();

В ней есть предметы Aptitude, Chemistry, Math, English, Physics, хранящиеся как 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,
},
]

Iхотите отображать $ вопросы в случайном порядке, не перетасовывая каждый вопрос, а перетасовывая предметы.Как Отображение всех вопросов по математике в случайном порядке, затем отображение всех вопросов по физике в случайном порядке и так далее.Предметы могут быть перетасованы в любом порядке, но вопросы не должны перетасовываться, например, сначала отображать один вопрос о способностях, затем другой вопрос по английскому, а затем так далее.Он должен отображаться так или в любом порядке, но в соответствии с темой.

[
{
    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 Ответ

1 голос
/ 21 мая 2019

Коллекции Laravel позволяют вам делать это с помощью нескольких вспомогательных методов:

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

groupBy('subject') даст вам 2d коллекцию, похожую на следующую:

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

shuffle() перетасует вышеупомянутую коллекцию.

flatten(1) удалит уровень группировки, предоставляя вам простой список вопросов, сгруппированных по перетасованной теме.параметр 1 означает «выравнивать только один уровень»;если вы пропустите это, вы получите странные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...