2011-12-29 88 views
0

我在PHP中的遞歸函數有問題。我的功能的目的是比較一個IP與一系列的IP。下面是兩個變量我的數據模型:PHP中的遞歸函數

Array 
(
    [0] => 150 
    [1] => 2 
    [2] => 0 
    [3] => 155 
) 
Array 
(
    [0] => Array 
     (
      [0] => 150 
      [1] => 26 
      [2] => 0 
      [3] => 0 
     ) 

    [1] => Array 
     (
      [0] => 150 
      [1] => 100 
      [2] => 255 
      [3] => 255 
     ) 

我知道迭代方法很可能是更好的,但它只是用於訓練recursives方法。 因此,這裏是我的代碼:

function checkRangeIp($ip_array, $range_ip_array, $recur_it = 0) { 
    if ($recur_it == 4) 
    return false; 
    $nb1 = $ip_array[$recur_it]; 
    $nb2 = $range_ip_array[0][$recur_it]; 
    $nb3 = $range_ip_array[1][$recur_it]; 

    if ($nb1 < $nb2 || $nb1 > $nb3) 
    return true; 
    else 
    checkRangeIp($ip_array, $range_ip_array, $recur_it + 1); 
} 

我不知道爲什麼,但是當我測試我的功能它總是給我一種虛假的回報。

if (checkRangeIp($ip_array, $range_ip_array)) 
    echo "TRUE\n"; 
else 
    echo "FALSE\n"; 

你有什麼想法嗎?謝謝。

+0

如果你只是比較每個範圍對,那麼它不適用於遞歸。改爲循環。 – mario 2011-12-29 11:39:32

+0

如果你的函數只有$ nb1 <$ nb2 || $ nb1> $ nb3'。第一個值「150」不是這種情況。所以不是返回,而是再次調用'checkRangeIp',但是你沒有返回那個調用的返回值,所以它不會返回任何東西。這就是說,即使這是固定的,我不認爲你的範圍檢查是正確的,這實際上不是一個遞歸解決方案的問題。 – 2011-12-29 11:40:43

回答

1

你有一個退出路徑checkRangeIp它不返回任何值(即遞歸調用)。通過

return checkRangeIp($ip_array, $range_ip_array, $recur_it + 1); 

更換它,否則函數調用將您if(...)條件內被評估爲false

注意:它看起來像你以某種方式混合truefalse。如果值在範圍之外,則條件($nb1 < $nb2 || $nb1 > $nb3)爲真,在這種情況下,函數返回true