Я создаю веб-сайт обмена подарками, куда люди вставляют свои электронные письма, а затем каждый из участников сопоставляется с другим участником (отправителем). Я использую PHP (возможно, Symfony, если это имеет значение).
Я ожидаю, что количество участников будет около 600-800, и это будет проводиться довольно часто.
Я подумал, что могу использовать shuffle()
и array_combine()
для массива получателей, чтобы сделать это. Однако после shuffle()
отправитель все еще может находиться в том же положении, поэтому ему придется подарить себе подарок Тайного Санты.
Например:
$recipients = "SQL query that returns array"
# ['bob', 'alice', 'joe']
$senders = $recipients;
shuffle($senders);
# ['alice', 'bob', 'joe']
$result = array_combine($recipients, $senders);
# ['bob' => 'alice', 'alice' = 'bob', 'joe' => 'joe']
Поэтому мне нужно гарантировать, что в конечном массиве ни одно из значений не равно ключу. До сих пор я думал о следующих возможных решениях, но все они кажутся дорогими и немного мусорными:
- Используйте
array_walk()
над окончательным массивом. Поместите любые значения в другой массив, а затем поменяйте их местами друг с другом. Если есть только 1, просто поменяйте его местами. - Возьмите все значения из массива
$recipients
с четными ключами и все значения из массива$senders
с нечетными ключами. Перемешайте оба этих массива. - Вместо использования
shuffle()
реализую свою дрянную версию, которая делает что-то вроде сдвига всех значений вперед на два, а затем выполняетarray_reverse()
. - Переберите получателей и используйте
array_rand()
, чтобы выбрать элемент из$senders
. Если это то же самое, выберите еще раз, в противном случае удалите его из массива, установите его как отправителя для этого получателя и перейдите к следующему получателю.
Возможно, я слишком много думаю об этом - есть ли более простой способ? Или есть особый способ сделать это в PHP, о котором я не знаю?
shuffle()
массива, в котором ключ равен значению. - person Dan Blows   schedule 07.08.2014