【问题标题】:Move 7 random elements from one array to another将 7 个随机元素从一个数组移动到另一个数组
【发布时间】:2015-12-13 17:14:06
【问题描述】:

在一个有 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() 可用于从数组中选择一个随机元素。

但是如何在这里以最有效的方式使用它来从$letters 数组中移动一个字母呢?

更新:

我尝试了以下,但是源数组开头的前7个字母没有被删除,为什么?

    shuffle($letters);
    $letters1 = array_slice($letters, 0, 7);
    $letters2 = array_slice($letters, 0, 7);

【问题讨论】:

  • 您可以 shuffle() 数组,然后使用 array_slice() 为玩家 1 取 0-6 个元素,为玩家 2 取 7-13 个元素
  • 我试过shuffle($letters); $letters1 = array_slice($letters, 0, 7); - 但前7个字母没有从$letters数组的开头删除。你知道为什么吗?
  • 如果你想删除它们你想看看:array_splice()

标签: php arrays random php-5.3


【解决方案1】:

我会对字母数组进行洗牌,并删除洗牌数组的第一个元素以获得一个随机字母。

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】:

    你可以使用array_diff:

    $letters = array_diff($letters, $letter1);
    $letters = array_diff($letters, $letter2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      相关资源
      最近更新 更多