选择无重复的随机数组元素

时间:2019-04-30 22:08:07

标签: php

我有一个包含30个元素的数组,如下所示:

$array = ["1","2",....,"29","30"];

在10行的表上,我需要将这些元素分布在行中,其中每一行从数组中获取三个随机元素,而不必重复每一行中的元素。

如何在PHP中完成此操作?

感谢您的回答,它非常有帮助。经过多次试验,我编写了以下代码:

<?
$array1  = ['one', 'two', 'three', 'four', 'five','six','seven','eight','nine','ten','eleven','twelve','thirteen','fourteen','fifteen'];
function RandomArrayNew($array){
     $keyrandom = array_rand($array, 3);
     $a= $array[$keyrandom[0]];
     $b= $array[$keyrandom[1]];
     $c= $array[$keyrandom[2]];
          $t = [$a, $b, $c];
          return $t;
 }
?>


<table style="width: 100%" class="bodymenu">
<?
$countRows = 5;
for ($i = 0; $i <= $countRows; $i++){
$x = RandomArrayNew($array1);
$y =array_diff($array1, [$x[0], $x[1], $x[2]]);
 echo "<tr>";
    echo"<td><input type='text' value='".$x[0]."'/></td>";
    echo"<td><input type='text' value='".$x[1]."'/></td>";
    echo"<td><input type='text' value='".$x[2]."'/></td>";
 echo "</tr>";
}

?>
</table>

此代码实际上通过for循环绘制5行,并且在每行中随机分布三个数字。问题是分配的数字重复。我需要防止行之间重复的数字。是否可以取消从原始数组分配的数字并在下一行中使用新数组?如果是的话,我该怎么办?

3 个答案:

答案 0 :(得分:1)

随机排列数组并将其分成三个块:

$numbers = range(1, 30);
shuffle($numbers);
$chunks = array_chunk($numbers, 3);

$chunks的示例输出:

Array
(
    [0] => Array
        (
            [0] => 22
            [1] => 29
            [2] => 3
        )

    [1] => Array
        (
            [0] => 19
            [1] => 13
            [2] => 30
        )

    [2] => Array
        (
            [0] => 16
            [1] => 5
            [2] => 27
        )

    [3] => Array
        (
            [0] => 25
            [1] => 10
            [2] => 9
        )

    [4] => Array
        (
            [0] => 11
            [1] => 17
            [2] => 20
        )

    [5] => Array
        (
            [0] => 23
            [1] => 4
            [2] => 28
        )

    [6] => Array
        (
            [0] => 6
            [1] => 12
            [2] => 15
        )

    [7] => Array
        (
            [0] => 7
            [1] => 21
            [2] => 26
        )

    [8] => Array
        (
            [0] => 8
            [1] => 2
            [2] => 24
        )

    [9] => Array
        (
            [0] => 18
            [1] => 1
            [2] => 14
        )

)

答案 1 :(得分:1)

一个一般的想法是获得一个随机数并拼接一个数组。数组将变小,下次您再次拼接时,将无法选择相同的元素。但是,通过这种方式,您正在修改原始数组,因此在进行后续操作之前,请先复制原始数组。

function giveMeRandom(array &$arrayAsRef) {
    if (!$arrayAsRef) {
        return null;
    }
    // Splice a random element between 0 and size of array - 1, and return it
    return array_splice($arrayAsRef, mt_rand(0, count($arrayAsRef) - 1), 1)[0];
}

$myArr = range(1, 30);

var_dump(giveMeRandom($myArr));
var_dump(giveMeRandom($myArr));
var_dump(giveMeRandom($myArr));

当然,您可以修改此函数以一次返回一个包含3个元素的数组。

答案 2 :(得分:0)

欢迎来到Stackoverflow

要获得帮助,您必须提供您尝试过的一些代码示例

因为您是新手,所以这里有一个片段应该可以完成工作

$array = range(1, 30);
$countRows = 10;
$countToPickByRow = 3;

if ($countToPickByRow > count($array)) {
    throw new \Exception('Impossible');
}

$rows = [];
for($i = 0; $i <= $countRows; $i++) {
    $row = [];

    while ($countToPickByRow !== count($row)) { 
        $random = $array[array_rand($array)];
        if (!in_array($random, $row)) { // If random value is'nt present, let's add it to my row
            $row[] = $random;
        }
    }

    $rows[] = $row; // Push generated row to my result rows array
}