PHP 唯一编号并替换



我们都知道 PHP 中的 rand(x,y),但这不适用于唯一数字。

问题 1:如何从 1-52 创建 5 个唯一数字,并将它们保存到数组中?

假设数组是:

$foo = array(1,2,3,4,5);

我有一个 secound 数组,其中包含$foo中的一些数字:

$egg = array(1,5,4);

问题 2:然后我怎样才能创建一个函数,该函数将获取并用新的唯一数字替换$foo中的每个数字,除了来自$egg的数字?(这将使2,3新的唯一数字)。

(又名:来自$egg的值仍然存在$foo但其他每个值都是新的)

<?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 个问题:

只需从您想要唯一随机数的位置创建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 )

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;
}

你可以尝试这样的事情。

    $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]);
        }
    });
  1. $r - 从范围内创建 5 个唯一数字
  2. $diff - differece beetwen - 范围和$egg与$r(唯一数字,在$egg和$r中不存在)
  3. array_walk - 走过$r并检查,如果数字在$egg离开它。如果数字不在$egg且$diff不为空,请从$diff中获取随机数(此处为唯一数字),替换当前$item(数字)并将其从$diff中删除(以避免重复)。

结果:

$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
]

这不是代码的最终版本,但它可以帮助您找到简单而正确的解决方案。

最新更新