Как разбить массив на основе условия? - PullRequest
0 голосов
/ 08 декабря 2011

Я работаю над приложением PHP / MySQL, и у меня есть очень простая таблица, которая выглядит следующим образом:

id | name | came_with
1    John    null
2    Jane    1
3    Dean    null

В ней около 50 записей, но основная идея состоит в том, что она хранит людей, которые регистрируютсядля события, если они приводят гостей, их имя также сохраняется с id человека, который пригласил их в поле came_with, очень просто.

Я должен перемешать эти имена и разделить ихв X число групп в зависимости от того, сколько человек я хочу в каждой группе, что было бы очень легко, поскольку я могу хранить каждую запись в массиве, используйте shuffle, чтобы рандомизировать порядок, и array_chunk, чтобы генерировать меньшие массивы в зависимости отколичество человек.

Проблема в том, что у меня не может быть людей, которые собрались в одной группе, поэтому в этом примере Джон и Джейн не могут быть в одной группе, это нормально, хотя длячеловек, который пришел еще с двумя, чтобы попасть в одну группу, если я выберу 2 группы, так как выбора нет.Я ОЧЕНЬ растерялся в том, что логика должна быть в попытках сделать это, я не спрашиваю точный код, но идеи о том, как это сделать.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 08 декабря 2011

Из результатов запроса вы можете построить карту (или массив, так как ключи вам на самом деле не нужны), чей ключ - "came_with", а значения - это группа идентификаторов, которые им принадлежат ... например,построенная карта будет выглядеть следующим образом:

guestmap[0] => [1, 3] // John and Dean came by themselves
guestmap[1] => [2] // Jane came with John

Отсюда вы можете перебирать эту guestmap , чтобы заполнить ваш окончательный массив groups .Для каждой записи в вашей guestmap найдите ее, перетасуйте ее, затем поместите каждую запись в массив groups по одной.

0 голосов
/ 08 декабря 2011

Если вы сортируете свой SQL по 'came_with', а затем 'id', вы знаете, какие лица не должны объединяться в одной группе.Затем вы можете создать массивы для этих «одинаковых» групп (вы можете их перемешать).С этими массивами вы должны продолжать ...

...