2016-06-28 3 views
0

Я запускаю функцию, и ее часть требует выбора случайного числа, однако она не может быть в массиве уже выбранных чисел. Поэтому, если выбранное случайное число находится в массиве, ему нужно выбрать новый номер. Кажется, я действительно борется с чем-то, что кажется так легкоphp рекурсивная функция не работает правильно

function choice() { 
global $countries; 
global $count; 
global $answers; 
global $choice; 
$i = rand(0,$count-1); 
if(in_array($i,$answers)) choice(); 
else { 
    $answers[] = $i; 
    $choice = $countries[$i]['capital_city']; 
    return $choice; 
} 

Таким образом, текущая логика здесь, он выбирает случайное число, проверяет его в массиве, если оно не то она устанавливает переменную и возвращает его , если он есть, то он генерирует новое число, перезапуская функцию. Что происходит, когда он находит одно в funtion, он возвращает пустой результат, а не возвращается через функцию. Что я делаю так неправильно?

+0

У этого случая есть синтаксическая ошибка. –

+2

Мы не можем никому, кто не поможет нам в первую очередь, сообщить нам, что такое точная ошибка и местоположение – Li357

+1

Вы не возвращаете рекурсивный вызов. – Rizier123

ответ

1

Добавить заявление return перед рекурсивным звонком.

function choice() { 
    global $countries; 
    global $count; 
    global $answers; 
    global $choice; 

    $i = rand(0,$count-1); 

    if(in_array($i,$answers)) return choice(); 
    else { 
     $answers[] = $i; 
     $choice = $countries[$i]['capital_city']; 
     return $choice; 
    } 
+0

Это похоже на работу, я знал, что мне не хватает чего-то такого простого, но я не смог его обработать. – Source

+0

Однако, что лучше, таким образом, или используя цикл while? – Source

+0

Я считаю, что цикл while будет иметь меньше накладных расходов. Я бы тоже использовал ссылки вместо глобальных – atoms

2

Если вам не нужно использовать resursion, не могли бы вы просто использовать цикл while?

function choice() { 
    global $countries; 
    global $count; 
    global $answers; 
    global $choice; 

    $i = rand(0,$count-1); 

    while (in_array($i,$answers)){  
     $i = rand(0,$count-1); 
    } 

    $answers[] = $i; 
    $choice = $countries[$i]['capital_city']; 
    return $choice; 
} 

Или использовать этот do while InPlace в while;

do { 
    $i = rand(0,$count-1); 
} while (in_array($i,$answers)); 
+1

Значение счета не нужно изменять. – Source

+1

Я думаю, что цикл while может выглядеть немного лучше здесь :) – Rizier123

+0

согласен, обновил ответ – atoms