Задача
Необходимо перетасовать колоду карт и раздать их.
Решение
Создайте массив из 52 целых чисел, перемешайте его и свяжите с картами:
$suits = array('Clubs', 'Diamonds', 'Hearts', 'Spades');
$cards = array('Ace', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'Jack', 'Queen', 'King');
$deck = pc_array_shuffle(range(0, 51));
(($draw = array_pop($deck)) != NULL) {
print $cards[$draw / 4] . ' of ' . $suits[$draw % 4] . "\n";
}
Этот код использует функцию pc_array_shuffle() из рецепта 4.20.
Обсуждение
Для английского представления карт создается пара массивов, $suits и $cards. Числа от 0 до 51 случайным образом расставляются и назначаются массиву $deck. Чтобы сдать карту, достаточно извлечь число из начала массива, рассматривая этот массив как буквальную колоду карт.
Необходимо добавить проверку на значение NULL внутри оператора while, иначе цикл прервется, когда вы вытащите нулевую карту. Если изменить колоду так, чтобы она содержала числа от 1 до 52, то, с математической точки зрения, сопоставление чисел и карт становится более сложным.
Чтобы сдать несколько карт сразу, вызовите функцию array_slice():
array_slice($deck, $cards * -1);