array_search递归函数php

时间:2014-01-27 23:03:26

标签: php

我有这个函数应该生成随机数并确保它们不在例外数组中,但我有这个角落的情况:

它不执行while条件:

Exceptions Array
(
    [0] => 84
    [1] => 94
    [2] => 46

)

print_r ouput 生成的数字是46我们有一个匹配号码即将返回84

所以它首先检查正确但不是递归检查,所以它返回给我一个重复值84,我的条件错了吗?

function randWithout($from, $to, array $exceptions) {
    //sort($exceptions); // lets us use break; in the foreach reliably
    echo '<pre>';
    print_r($exceptions);
    echo '</pre>';
    $number = mt_rand($from, $to); 
    print_r('number generated is' . $number);
    if(array_search($number,$exceptions) != FALSE) 
    {
        echo 'we have a match';
        do {

            $number = mt_rand($from, $to);

        } while(array_search($number,$exceptions) === FALSE);
    }
    print_r('number im going to return is'. $number);
    return $number;
}

2 个答案:

答案 0 :(得分:1)

好的,你应该把它改成:

$ex = [12,18,15];

for($i=0; $i<20;$i++) {
    print randWithout(10,20,$ex) . PHP_EOL;
}

function randWithout($from, $to, array $exceptions) {
    do {
        $number = mt_rand($from, $to);
    } while(in_array($number,$exceptions));

    return $number;
}

刚试过它并且有效。

答案 1 :(得分:0)

更改为:

if(in_array($number,$exceptions) != FALSE) 
    {
        echo 'we have a match';
        do {

            $number = mt_rand($from, $to);

        } while(in_array($number,$exceptions));
    }

从in_array中删除了== FALSE子句,因为如果找到了针,它将返回true。