PHP唯一的数字和替换?

时间:2015-04-29 08:28:30

标签: php arrays performance

我们都知道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中,但每个其他值都是新的)

4 个答案:

答案 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]);
        }
    });
  1. $ r - 从范围
  2. 创建5个唯一数字
  3. $ diff - differece beetwen - range和$ egg with $ r(唯一数字,$ egg和$ r中不存在)
  4. array_walk - 按$ r行走并检查,如果$ egg中的数字离开它。如果number不在$ egg而不是$ $ diff,则从$ diff获取随机数(这里是唯一数字),替换当前$ item(数字)并从$ diff中删除它(以避免重复)。
  5. 结果:

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

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