Php 我需要一个比较变量的较短方法?

Php 我需要一个比较变量的较短方法?,php,Php,好的,我有15个变量$A-$O。我需要一种不同的方法来比较变量,因为我认为我做这件事的时间非常长。它按照我希望的方式工作,但我对代码量不满意 所以我的代码是为每个变量生成一个随机数。当它们彼此相等时,我让它这样做,换句话说,当每个变量不同时,它将停止生成随机数。这是我的代码。。。提前谢谢 do{ $a = rand($min,$max); $b = rand($min,$max); $c = rand($min,$max); $d = rand($min,$max); $e = rand

好的,我有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
       );    

在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();
for($i = 0; $i < 10; $i++) {
    $arr[] = rand($min,$max);
}
$arr=array();
对于($i=0;$i<10;$i++){
$arr[]=兰特($min,$max);
}
试试这个

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

最简单的方法是将变量添加到数组中,然后执行do,同时执行以下操作:

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

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

但在您的示例中,您正在做许多不需要的工作,例如不要重新随机生成唯一值。只是一个提示。

您可以通过阵列来实现这一点:

$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
因为我写了
$$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)

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

$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=array();

虽然(sizeof($myvars)您已经检查了$a==j(例如),那么为什么要检查$j==a呢?是的,我在一些地方做过,但这并不是我要问的!感谢您的反馈。“与大多数语言不同”?基于你是怎么说的?Python、C#、RoR……有很多语言支持这一点。同样使用
global$$name
也有各种各样的错误。我知道这是错误的,但我应该如何回答这个问题?我不知道特雷弗·基廷到底想要什么,我试着指出有一些方法可以做到这一点使用一些函数或循环。关于通过字符串调用变量——例如,在C语言中这样做真的那么容易吗?我只是没有看到任何其他语言像PHP这样简单,也许我当时的说法是错误的。@KeluThatsall:相对来说很容易。习惯于编写Java的人会发现反射和
Map
没有那么难。C#和python都有字典,可以让你做同样的事情,甚至JS(
window[strvarnameval]
)也让它变得非常简单:基本上,每种非编译语言都支持这一点(某种方式,只要通过
eval
),字节码编译语言通常会这样做,Toook不知道,感谢您的澄清:)但我认为使用Map或Dictionary与使用
$$name
一样简单。我不是说数组中的命名索引。这不是最简单的方法,在某些方面也是如此。除非必要,否则不要使用参考资料。在这种情况下,您不会这样做,尤其是因为您正在筑巢loops@EliasVanOotegem确实需要引用,只是不像您在嵌套的for each中所描述的那样。我仍然坚持我的回答,这是最简单的方法,因为它将更适用。我更新了我的答案。你没有抓住要点:引用是危险的(阅读我的答案:你可以去掉它们,仍然可以看到随机值分配给不同的值)。另外:
someFunction(&$passByRef)
将发出
E\u弃用
通知。不确定
数组(&$a)
但如果我知道这也会触发同样的通知,我也不会感到惊讶。即使没有:如果我在你的代码后面加上这样的行:
$b=reset($arr)$a=‘foo’
如果
$b
,会发生什么情况?@EliasVanOotegem对于函数,仅从调用方的角度来看,不推荐使用pass-by引用。这就是为什么我说,我不确定构建数组是否会发出通知:但您使用引用时,甚至没有警告OP任何风险。请记住,OP的问题并不意味着他甚至意识到他们是这样一个参考人。这就像给一个婴儿一把枪:它可能会把它当作玩具或棒棒糖……哇,嵌套3层深,
->
做……而
->
foreach
。请参阅我的答案:1个循环,包含2行代码:完全符合same@EliasVanOotegem你是对的。我已将其更改为在数组中使用
。我的回答的意思是,解决方案必须是快速的,因此逐个创建元素要比创建每个元素并进行比较好。您的方法有点不同,因为您创建了元素,将其放入数组中,然后调用
array\u unique
。有趣的问题是:如果数据量更大,什么会更有效率?我很确定这并没有你想象的那么快。我马上会给我的答案添加一个更快的版本,而你仍然在嵌套循环:不需要。范围越宽,复制的可能性就越小,并且可能不需要进行检查。但即使您这样做:
在数组中
是一个函数调用
isset
是一个语言构造->faster@EliasVanOotegem
array\u unique
的复杂性是什么?我不确定它是否像你想的那么快。我们可以做一些
基准测试
,只是为了好玩:数组中的D
是O(n),而
array\u unique
更接近O(logn)。但在一个由15个元素组成的数组中,实际情况是两者的性能大致相同。对我的答案的编辑使用数组的键(PHP数组是哈希表+
isset
是一种语言构造,使得

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