2014-11-04 20 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

相关问题