2014-11-04 23 views
1

我試圖找到兩個數字之間的單位數量,這些數字在0和一個限制之間,並且超過了該限制。這是我的功能。它工作正常,直到我必須處理一些需要大量時間處理的巨大數字。我試圖找到一種方法來執行此代碼而不使用循環。PHP - 兩個數字之間的單位數

public function getBetween($num1, $num2) { 
    $limit = 500000; 
    $array = array(0,0,0); 

    if ($num1 >= $num2) { 
     $low = $num2; 
     $high = $num1; 
    } else { 
     $low = $num1; 
     $high = $num2; 
    } 

    for($i=$low; $i < $high; $i++) { 
     if ($i < 0) { 
      $array[0]++; 
     } elseif ($i >= 0 && $i < $limit) { 
      $array[1]++; 
     } else { 
      $array[2]++; 
     } 
    } 
    return $array; 
} 

我開始我的循環分成ELSEIF語句,但這是越來越亂真快,我還必須最終能夠設置一個以上的限制將變得無法使用。

if ($low < 0 && $high < 0) { 
} elseif ($low < 0 && $high >= 0 && $high < $limit) { 
} elseif ($low < 0 && $high >= $limit) { 
} elseif ($low >= 0 && $low < $limit && $high < 0) { 
} elseif ($low >= 0 && $low < $limit && $high >= 0 && $high < $limit) { 
} elseif ($low >= 0 && $low < $limit && $high >= $limit) { 
} elseif ($low >= $limit && $high < 0) { 
} elseif ($low >= $limit && $high >= 0 && $high < $limit) { 
} elseif ($low >= $limit && $high >= $limit) { 
} 

我想找到一個乾淨的方式來做到這一點。有任何想法嗎?

編輯

這裏是陣列我想要得到的一個例子。 如果我的極限是500,$num1 = -100和$num2 = 700我會得到陣列

$array[0] = 100 
$array[1] = 500 
$array[2] = 200 
+0

對不起,我剛剛讀到'我還必須最終能夠設置多個限制',我假設我的答案不符合它。你能否給出一個例子,說明預期有多個限制的結果? – 2014-11-04 14:33:38

+0

我目前不是百分之百地確信我將如何用更多的限制來完成。但我會得到一個限制 $ limits = array(0,500,2000,10000); 我會檢查0之前,0到500之間,500到2000之間,2000到10000之間,超過10000之間的單位數。就像我說的,我不知道如何去做,但我會依賴於我最終使用的解決方案。 – 2014-11-04 15:21:38

+0

我剛剛編輯了我的答案,用盡可能多的限制符合您的需求。 – 2014-11-04 15:54:54

回答

1

我沒有測試它(沒跑PHP腳本,但我用「手動」試了一下幾個例子)。

您仍然有循環,但每次限制只有一次迭代(而不是每個單位一次)。

// Example datas 
$limits = array(0, 500, 800); 
$low = -100; 
$high = 1000; 

$splittedResults = array(); 

// Get total of units 
$totalUnits = abs($high - $low); 

$totalCounted = 0; 
foreach($limits as $limit) { 
    if ($low > $limit) { 
    // Nothing under the limit 
     $nbUnderLimit = 0; 
    } elseif($high < $limit) { 
    // Both values under the limit 
     $nbUnderLimit = $totalUnits; 
    } else { 
    // $low under the limit and $high over it 
     $nbUnderLimit = abs($limit - $low); 
    } 

    // Here we know how much units are under current limit in total. 
    // We want to know how much are between previous limit and current limit. 

    // Assuming that limits are sorted ascending, we have to remove already counted units. 
    $nbBetweenLimits = $nbUnderLimit - $totalCounted; 

    $splittedResults[] = $nbBetweenLimits; 
    $totalCounted += $nbBetweenLimits; 
} 

// Finally, number of units that are over the last limit (the rest) 
$splittedResults[] = $totalUnits - $totalCounted; 
+0

太棒了!非常感謝! – 2014-11-04 16:04:41

+0

沒問題,這些小算法問題是我的最愛!總是很有趣地找到答案(並與其他人比較以查看我的錯誤,有時有幾種方法可以做到這一點)。 :)我在「限制」行下的兩個值中修正了一個錯誤(我使用了錯誤的變量)。 – 2014-11-04 16:08:42

0

您可以創建數字與範圍的數組(),並使用array_filter

$count = sizeof(array_filter (range(0,800), function($value){ return ($value > 500); })); 

而且一個<以及等

你只需要一次定義範圍陣列,分別。

+0

好主意(我總是忘記查看'array'函數,但它們中的大多數都是非常有用的),但是不會花費一些時間來處理巨大的值嗎? (這是一個真正的問題,而不是免費的批評。) – 2014-11-04 14:35:51

+0

很難說,我現在只有32位訪問權限,它在幾分之一秒內運行了400k範圍。 – 2014-11-04 14:37:37

+0

使用範圍確實比較乾淨,但比使用當前使用的循環的功能要長48倍。 – 2014-11-04 15:15:39

相關問題