我们都知道PHP中的rand(x,y),但这不适用于唯一的数字。
问题1:如何从1-52创建5个唯一数字,并将它们保存到数组中?
我们可以说数组是:
$foo = array(1,2,3,4,5);
我在$ foo中有一些带有一些数字的数组:
$egg = array(1,5,4);
问题2:我怎样才能制作一个功能,除$foo
的数字外,用$egg
中的每个数字替换新的唯一数字?
(这会使2,3
个新的唯一数字。)
(又名:来自$egg
的值仍然存在于$foo
中,但每个其他值都是新的)
答案 0 :(得分:3)
<?php
// QUESTION 1
$result = array();
while(count($result) != 5) {
$rand = rand(1,52);
if(!in_array($rand,$result)){
$result[] = $rand;
}
}
var_dump($result);
// QUESTION 2
$foo = array(1,2,3,4,5);
$egg =array(1,5,4);
function my_function($input,$exclude){
$i = 0;
$output = array();
while($i < count($input)) {
$rand = rand(1,52);
if(in_array($input[$i], $exclude)) {
$output[$i] = $input[$i];
$i++;
}
else if(!in_array($rand, $input)){
$output[$i] = $rand;
$i++;
}
}
return $output;
}
var_dump (my_function($foo, $egg));
答案 1 :(得分:1)
Q#1这样可行
<?php
$arr = [];
for($i = 0; $i < 5; $i++){
$rand = rand(1, 52);
if(!in_array($rand, $arr)){
array_push($arr, $rand);
}else{
$i--;
}
}
print_r($arr);
?>
,Q#2
$foo = array(1,2,3,4,5);
$egg = array(1,5,4);
print_r(unique($foo, $egg));
function unique($foo, $egg){
array_merge($foo, $egg);
$unique = array_unique($foo);
return $unique;
}
答案 2 :(得分:1)
1问题:
只需从您想要唯一随机数的位置创建range()
即可。 shuffle()
数组,然后从中获取array_slice()
,如下所示:
<?php
$range = range(1, 52);
shuffle($range);
$randomNumbers = array_slice($range, 0, 5);
print_r($randomNumbers);
?>
可能的输出:
Array ( [0] => 25 [1] => 32 [2] => 7 [3] => 52 [4] => 35 )
2问题:
首先通过array_diff()
获取两个数组的差异。在此之后,创建$diff
范围内的任意数量的随机数。但是,请排除$foo
数组中已包含的所有数字,以免再次出现重复。
然后,您可以使用随机数array_combine()
替换要替换的数字。
在此之后,只需使用array_map()
遍历所有数组元素并检查是否必须替换,如果是,则返回替换的数字。
<?php
$range = range(1, 52);
$foo = [1, 2, 3, 4, 5];
$egg = [1, 5, 4];
$diff = array_diff($foo, $egg);
$range = array_diff($range, $foo);
shuffle($range);
$replacement = array_combine($diff, array_slice($range, 0, count($diff)));
$foo = array_map(function($v)use($replacement){
if(isset($replacement[$v]))
return $replacement[$v];
return $v;
}, $foo);
print_r($foo);
?>
可能的输出:
Array ( [0] => 1 [1] => 27 [2] => 10 [3] => 4 [4] => 5 )
答案 3 :(得分:0)
你可以尝试这样的事情。
$r = array_rand(array_flip(range(1, 10)), 5);
$egg = [3, 5, 8];
$diff = array_diff(range(1, 10), $r, $egg);
array_walk($r, function(&$item, $key) use ($egg, &$diff) {
if (!in_array($item, $egg) && $diff) {
$key = array_rand($diff);
$item = $diff[$key];
unset($diff[$key]);
}
});
结果:
$r = [
0 => 1
1 => 3
2 => 7
3 => 8
4 => 10
]
$egg = [3, 5, 8];
// after walk
array:5 [
0 => 9
1 => 3
2 => 2
3 => 8
4 => 4
]
这不是代码的最终版本,但它可以帮助您找到简单明了的解决方案。