【问题标题】:PHP unique numbers and replace?PHP唯一编号和替换?
【发布时间】:2015-04-29 08:28:30
【问题描述】:

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

【问题讨论】:

  • 是时候开始玩array functions
  • 你有什么特别的数组函数给我看吗?
  • 是的,range, shuffle, array_rand, array_diff 开始
  • 使用array_diff()函数..
  • @maria 仅供参考:当前接受的答案不是很好:if you need a bit of performance。与您的数组(范围)一样大,接受答案将不再起作用!也没有解释

标签: php arrays performance


【解决方案1】:
<?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));

【讨论】:

  • 不错的代码。但是,在问题二中,$eggs 的值还在吗?
  • 如果您要求的是,它们不会被修改
  • 您能否编辑一下,所以问题二的答案是 $egg 中的值仍然存在于 $foo 中,但其他所有值都是新的?
  • 完成,但也请编辑您的问题,因为我的答案与它不匹配
  • 这个问题有点混乱。我对问题 #2 的回答是从 foo 和 egg 中删除相同的值,并从 foo 中保留另一个
【解决方案2】:

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】:

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

【讨论】:

  • 您的问题 1 的代码正在使用此循环破坏性能!
【解决方案4】:

你可以试试这样的。

    $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 - 不同 beetwen - range 和 $egg 与 $r(唯一的数字,不存在于 $egg 和 $r)
  3. array_walk - 走过 $r 并检查 $egg 中的数字是否离开它。如果 number 不在 $egg 中且 $diff 不为空,则从 $diff 中获取随机数(这里是唯一的数字),替换当前的 $item (number) 并将其从 $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
]

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

【讨论】:

  • 我会试试这个答案。
  • 如何从数组遍历中获取包含新数字的数组?
  • 通过引用传递给array_walk数组。项目功能改变,数组改变。函数 array_wlak 改变传递给它的数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多