2014-01-27 3 views
1

У меня есть эта функция, которая, как предполагается, для генерации случайных чисел и убедиться, что они не находятся в массиве исключений, но у меня есть этот угол случай:array_search рекурсивная функция PHP

Он не выполняет условий при:

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

) 

print_r Ouput: номер генерируемый 46 мы имеем целый ряд матч им будет вернуться в 84

так это делает первый чек Corre ctly, но не рекурсивный чек, поэтому он возвращает мне дублирующее значение 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; 
} 
+1

Возможно, я просто слепой, но я не вижу рекурсии в приведенном выше. Не могли бы вы указать на это? – Daedalus

+0

'while (array_search ($ number, $ exceptions) === FALSE)' but 'im think Мне просто нужно 'return $ number' внутри, если цикл – Edward

+0

Рекурсия - это когда функция вызывает себя. Это не происходит выше. – Daedalus

ответ

1

Ok вот что вы должны изменить его на:

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

Просто проверил его и он работает.

+0

array_search возвращает ключ для иглы, если он найден в массиве, в противном случае FALSE. Так что это должно сработать нормально, я попробовал in_array() такую ​​же проблему. – Edward

0

изменен:

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

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

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

Убран пункт == FALSE от in_array, так как она возвращает истину, если игла находится.

Смежные вопросы