我需要一种更短的比较变量的方法吗?

时间:2014-02-20 10:12:57

标签: php

好的我有15个变量$ A - $ O.我需要一种不同的方式来比较变量,因为我认为我这样做很长。它按照我想要的方式工作,但我对代码量不满意。

那么我的代码在做什么就是为每个变量生成一个随机数。我有这样做,虽然他们彼此相等,所以换句话说,当每个变量不同时,它将停止生成随机数这里是我的代码...在此先感谢。

    do{
$a = rand($min,$max);
$b = rand($min,$max);
$c = rand($min,$max);
$d = rand($min,$max);
$e = rand($min,$max);
$f = rand($min,$max);
$g = rand($min,$max);
$h = rand($min,$max);
$i = rand($min,$max);
$j = rand($min,$max);
$k = rand($min,$max);
$l = rand($min,$max);
$m = rand($min,$max);
$n = rand($min,$max);
$o = rand($min,$max);
}

while ($a==$b || $a==$c || $a==$d || $a==$e || $a==$f || $a==$g || $a==$h || $a==$i || $a==$j || $a==$k || $a==$l || $a==$m || $a==$n || $a==$o
       || $b==$a || $b==$c || $b==$d || $b==$e || $b==$f || $b==$g || $b==$h || $b==$i || $b==$j || $b==$k || $b==$l || $b==$m || $b==$n || $b==$o
       || $c==$a || $c==$b || $c==$d || $c==$e || $c==$f || $c==$g || $c==$h || $c==$i || $c==$j || $c==$k || $c==$l || $c==$m || $c==$n || $c==$o 
       || $d==$a || $d==$b || $d==$c || $d==$e || $d==$f || $d==$g || $d==$h || $d==$i || $d==$j || $d==$k || $d==$l || $d==$m || $d==$n || $d==$o 
       || $e==$a || $e==$b || $e==$c || $e==$d || $e==$f || $e==$g || $e==$h || $e==$i || $e==$j || $e==$k || $e==$l || $e==$m || $e==$n || $e==$o 
       || $f==$a || $f==$b || $f==$c || $f==$d || $f==$e || $f==$g || $f==$h || $f==$i || $f==$j || $f==$k || $f==$l || $f==$m || $f==$n || $f==$o 
       || $g==$a || $g==$b || $g==$c || $g==$d || $g==$e || $g==$f || $g==$h || $g==$i || $g==$j || $g==$k || $g==$l || $g==$m || $g==$n || $g==$o 
       || $h==$a || $h==$b || $h==$c || $h==$d || $h==$e || $h==$f || $h==$g || $h==$i || $h==$j || $h==$k || $h==$l || $h==$m || $h==$n || $h==$o 
       || $i==$a || $i==$b || $i==$c || $i==$d || $i==$e || $i==$f || $i==$g || $i==$h || $i==$j || $i==$k || $i==$l || $i==$m || $i==$n || $i==$o 
       || $j==$a || $j==$b || $j==$c || $j==$d || $j==$e || $j==$f || $j==$g || $j==$h || $j==$i || $j==$k || $j==$l || $j==$m || $j==$n || $j==$o 
       || $k==$a || $k==$b || $k==$c || $k==$d || $k==$e || $k==$f || $k==$g || $k==$h || $k==$i || $k==$j || $k==$l || $k==$m || $k==$n || $k==$o 
       || $l==$a || $l==$b || $l==$c || $l==$d || $l==$e || $l==$f || $l==$g || $l==$h || $l==$i || $l==$j || $l==$k || $l==$m || $l==$n || $l==$o 
       || $m==$a || $m==$b || $m==$c || $m==$d || $m==$e || $m==$f || $m==$g || $m==$h || $m==$i || $m==$j || $m==$k || $m==$l || $m==$n || $m==$o 
       || $n==$a || $n==$b || $n==$c || $n==$d || $n==$e || $n==$f || $n==$g || $n==$h || $n==$i || $n==$j || $n==$k || $n==$l || $n==$m || $n==$o 
       || $o==$a || $o==$b || $o==$c || $o==$d || $o==$e || $o==$f || $o==$g || $o==$h || $o==$i || $o==$j || $o==$k || $o==$l || $o==$m || $o==$n
       );    

5 个答案:

答案 0 :(得分:1)

您可以使用数组执行此操作:

$randoms = array();
while(count($randoms) < 15)
{
    $randoms[] = mt_rand($min, $max);//add random
    $randoms = array_unique($randoms);//remove duplicates
}
$randoms = array_combine(range('a', 'o'), $randoms);//set keys a to o

如果真的 真的 希望这些值作为单独的变量,您可以使用variable variables执行此操作:

foreach ($randoms as $letter => $val)
{
    $$letter = $val;
}

因为我写了$$letter(请注意两个$符号),所以此表达式的计算结果为$<value of $letter>$a$b等等。分配相应的值

我想,如果你想以最少的代码/开销获得最佳性能,那么这就是获得它的方法:

$random = array();
$count = 0;
$rand = null;
while($count < 15)
{
    $rand = mt_rand($min, $max);
    if (!isset($random[$rand]))
    {//assign random value, and use keys for faster lookup
        ++$count;
        $random[$rand] = $rand;
    }
}
var_dump($random);//guaranteed to hold 15 random values, both the keys and values
//so:
$vals = array_values($random);//or array_keys($random)

再次,将此数组转换为不同的变量:

$arr = array_combine(range('a', 'o'), array_values($random));
//or even array_combine(range('a', 'o'), $random);
foreach ($arr as $name => $val)
    $$name = $val;

答案 1 :(得分:0)

在PHP中,您可以使用变量按字符串中的名称访问其他变量。

例如,你可以在你的情况下做类似的事情:

$names = array('a','b','c','d'); // And so on - it can be done easier with casting to char

function check_names_equal($names) {
    foreach($names as $name) {
        global $$name;
    }
    foreach($names as $name) {
        foreach($names as $name2) {
            if ($name != $name2 && $$name == $$name2) {
                return true;
            }
        }
    }
    return false;
}

while(check_names_equal($names)); // <- this is your shortened while

我对此的评论 - 我知道这不是完美的方式,我建议您使用数组来保存变量,不要将一些随机数据存储在单个变量中。

你的代码开头应该是这样的:(最好还是使用数字作为索引,所以你可以使用循环)

$arr = array();
$arr['a'] = rand($min,$max);
$arr['b'] = rand($min,$max);
$arr['c'] = rand($min,$max);
$arr['d'] = rand($min,$max);
$arr['e'] = rand($min,$max);
$arr['f'] = rand($min,$max);
$arr['g'] = rand($min,$max);
$arr['h'] = rand($min,$max);
$arr['i'] = rand($min,$max);
$arr['j'] = rand($min,$max);
$arr['k'] = rand($min,$max);
$arr['l'] = rand($min,$max);
$arr['m'] = rand($min,$max);
$arr['n'] = rand($min,$max);
$arr['o'] = rand($min,$max);

使用数字索引:

$arr=array();
for($i = 0; $i < 10; $i++) {
    $arr[] = rand($min,$max);
}

答案 2 :(得分:0)

试试这个

    $min = 0;
    $min = 999;
    while (count($array) < 16){
        $val = rand($min,$max);
        if (!in_array($val, $array)) {
            $array[] = $val;
        }
    }

答案 3 :(得分:0)

最简单的方法是将变量添加到数组中,然后执行do-while:

$arr = array(&$a, &$b, &$c, &$d);

do {
    foreach ($arr as $i => $k)
        $arr[$i] = rand($min, $max);
}
while (count($arr) == array_unique($arr));

但是在你的例子中,你正在重做很多不需要的工作,例如不重新随机选择唯一值。只是一个提示。

答案 4 :(得分:0)

另一个选择是创建一个数组并使用随机值来增长它,将每个新值与现有值进行比较:

$myvars=array();
while (sizeof($myvars)<15)
{
    $success=false;
    do{
        $candidate=rand($min,$max);
        //compare the candidate with every element in array
        if (!in_array($candidate, $myvars))
            $success=true; //if found no success
    } while (!$success);
    $myvars[]=$candidate;

}

现在$myvars你有15个不同的值。