像这样(根据我最初的评论),
$array = [];
while( count($array) < 3 ){
$rand = mt_rand(1,36);
$array[$rand] = $rand;
}
print_r( $array );
通过将“键”设置为随机数,我们可以滥用关联数组键是唯一的这一事实。然后,只需等待数组包含所需数量的唯一项目即可。
你可以测试一下here http://sandbox.onlinephpfunctions.com/code/0fd9dbd408cf81bbde381e7e42427c85e2e7cd19
输出:(你的结果可能会有所不同,它是随机的)
Array
(
[16] => 16
[20] => 20
[27] => 27
)
UPDATE我试图想出一种不使用循环的有效方法(在下班回家的路上),这种方法在某些情况下可能会更好。
$a = range(1,36);
shuffle($a);
$array = array_slice($a, 0, 3);
print_r($array);
当您必须查找的项目数量较多时,这将具有更好的性能。这是因为没有重复,没有冲突。因此,如果您的范围较小,但需要查找许多商品进行退货,那么这样做效果会更好。如果您有很多项目并且只需要返回很少的项目,那么第一个可能会更好,如果不是从速度方面考虑,那么从内存使用方面考虑。
你可以看到here http://sandbox.onlinephpfunctions.com/code/5696894c975c4ba33be2dbac226cf4ab051ae9e1
作为参考,这使用
range() - 创建一个包含一系列元素的数组。
http://php.net/manual/en/function.range.php http://php.net/manual/en/function.range.php
shuffle() - 随机排列(随机化元素的顺序)数组。它使用不适合加密目的的伪随机数生成器。
http://php.net/manual/en/function.shuffle.php http://php.net/manual/en/function.shuffle.php
array_slice() - 返回由 offset 和 length 参数指定的数组中的元素序列。
http://php.net/manual/en/function.array-slice.php http://php.net/manual/en/function.array-slice.php
所以解释一下最后一个
- 首先,我们创建一个数组,其中包含每个可能的数字作为元素。例如这样
[1,2,3,4,5,6, ...]
.
- 接下来我们对其进行洗牌,从而随机化整个数组的顺序。 Shuffle 通过“引用”修改数组,因此它不会返回我们的数组,因此没有赋值(我认为它返回布尔值,但是我不知道它如何失败并返回 false,几乎它只是返回 true,我们不想用 ) 覆盖我们的数组。所以我们的例子就变成了这样
[16,20,27,14,5,1, ...]
- 最后,我们削减了需要退回的物品数量。最后我们以此结束这个例子
[16,20,27]
;
您可以通过分配$rand
循环条件中的变量。像这样:
$array = [];
while( count($array) < 3 && false !== ($rand = mt_rand(1,36))) $array[$rand] = $rand;
Because mt_rand(1,36)
永远不会返回 boolan false。如果我还记得的话mt_rand
是相同的rand
现在,或者至少在当前的 PHP 版本中。
注意:从 PHP 7.1.0 开始,rand() 使用与 mt_rand() 相同的随机数生成器。为了保持向后兼容性,rand() 允许 max 小于 min,而不是像 mt_rand() 返回 FALSE。http://php.net/manual/en/function.rand.php http://php.net/manual/en/function.rand.php
希望对你有帮助,记得跳出框框思考。