PHP - 两个数字之间的单位数

时间:2014-11-04 13:53:02

标签: php

我正在尝试找到介于0之间且超出限制且超过此限制的2个数字之间的单位数。这是我的功能。它工作正常,直到我必须处理一些需要花费大量时间来处理的巨大数字。我试图找到一种方法来执行此代码而不使用循环。

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

您可以使用range()创建数字数组并使用array_filter

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

一个用于&lt;等等。

您只需要单独定义范围数组一次。