将 7 个随机元素从一个数组移动到另一个数组
Move 7 random elements from one array to another
在一个有 2 个玩家的文字游戏中,我想在 PHP 5.3 函数创建一个新游戏中给每个玩家 7 个随机字母:
$LETTERS = array( '*', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' );
$NUMBERS = array( 2, 10, 3, 5, 3, 5, 9, 2, 2, 8, 4, 6, 4, 5, 8, 10, 6, 6, 6, 5, 3, 1, 2, 1, 2, 1, 1 );
function createGame($dbh, $uid) {
global $LETTERS, $NUMBERS;
$letters = array();
$letters1 = array();
$letters2 = array();
for ($i = 0; $i < count($LETTERS); $i++) {
$letter = $LETTERS[$i];
$number = $NUMBERS[$i];
for ($n = 0; $n < $number; $n++) {
array_push($letters, $letter);
}
}
for ($i = 0; $i < 7; $i++) {
/* TODO move random letter from $letters to $letter1 */
/* TODO move random letter from $letters to $letter2 */
}
$sth = $dbh->prepare('insert into games (player1, stamp1, stamp2, letters1, letters2, letters, board) values (?, unix_timestamp(now()), 0, ?, ?, ?, space(225))');
$sth->execute(array($uid, join('', $letters1), join('', $letters2), join('', $letters)));
return $dbh->lastInsertId();
}
我知道 array_rand() 可用于 select 数组中的随机元素。
但是这里如何最有效地使用它从$letters
数组中移动一个字母呢?
更新:
我试过以下方法,但没有从源数组的开头删除前 7 个字母,为什么?
shuffle($letters);
$letters1 = array_slice($letters, 0, 7);
$letters2 = array_slice($letters, 0, 7);
您可以使用 array_diff:
$letters = array_diff($letters, $letter1);
$letters = array_diff($letters, $letter2);
我将打乱字母数组并删除打乱数组的第一个元素以获得一个随机字母。
shuffle($letters); // Mix alle array elements
for ($i = 0; $i < 7; $i++) {
$letters1[] = array_shift($letters); // get first array element, removing it from $letters
$letters2[] = array_shift($letters); // get first array element, removing it from $letters
}
在一个有 2 个玩家的文字游戏中,我想在 PHP 5.3 函数创建一个新游戏中给每个玩家 7 个随机字母:
$LETTERS = array( '*', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' );
$NUMBERS = array( 2, 10, 3, 5, 3, 5, 9, 2, 2, 8, 4, 6, 4, 5, 8, 10, 6, 6, 6, 5, 3, 1, 2, 1, 2, 1, 1 );
function createGame($dbh, $uid) {
global $LETTERS, $NUMBERS;
$letters = array();
$letters1 = array();
$letters2 = array();
for ($i = 0; $i < count($LETTERS); $i++) {
$letter = $LETTERS[$i];
$number = $NUMBERS[$i];
for ($n = 0; $n < $number; $n++) {
array_push($letters, $letter);
}
}
for ($i = 0; $i < 7; $i++) {
/* TODO move random letter from $letters to $letter1 */
/* TODO move random letter from $letters to $letter2 */
}
$sth = $dbh->prepare('insert into games (player1, stamp1, stamp2, letters1, letters2, letters, board) values (?, unix_timestamp(now()), 0, ?, ?, ?, space(225))');
$sth->execute(array($uid, join('', $letters1), join('', $letters2), join('', $letters)));
return $dbh->lastInsertId();
}
我知道 array_rand() 可用于 select 数组中的随机元素。
但是这里如何最有效地使用它从$letters
数组中移动一个字母呢?
更新:
我试过以下方法,但没有从源数组的开头删除前 7 个字母,为什么?
shuffle($letters);
$letters1 = array_slice($letters, 0, 7);
$letters2 = array_slice($letters, 0, 7);
您可以使用 array_diff:
$letters = array_diff($letters, $letter1);
$letters = array_diff($letters, $letter2);
我将打乱字母数组并删除打乱数组的第一个元素以获得一个随机字母。
shuffle($letters); // Mix alle array elements
for ($i = 0; $i < 7; $i++) {
$letters1[] = array_shift($letters); // get first array element, removing it from $letters
$letters2[] = array_shift($letters); // get first array element, removing it from $letters
}