php – 生成一个不规则步骤的范围.优化

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 生成一个不规则步骤的范围.优化脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_2@
PHP是否具有针对不规则步长范围的现有功能,是否存在提供此功能的通用解决方案,或者如何优化以下功能

一个功能是我关注的功能.第二个函数一个真实世界的用例,它生成一个数组来填充输出HTML选择下拉列表的函数的值.

<?PHP

function range_multistep($min,$max,Array $steps,$jmp = 10) {
    $steps = array_unique($steps);
    sort($steps,SORT_NUMERIC);

    $Bigstep = ($jmp > 0) ? $jmp : $jmp * -1;

    $e = ($min > 0) ? floor(LOG($min,$bigstep)) : 0;
    for (; ; $e++) {
        foreach ($steps as $step) {
            $jump = pow($bigstep,$e);
            $num = $step * $jump;
            if ($num > $max) {
                break 2;
            } elseif ($num >= $min) {
                $arr[] = $num;
            }
        }
    }

    $arr = array_unique($arr);
    sort($arr,SORT_NUMERIC);

    return $arr;
}

function PRices() {
    $price_steps = range_multistep(50,100000,array(5,10,25));

    $prev_step = 0;
    foreach ($price_steps as $price) {
        $price_str = '$' . $prev_step . ' - $' . ($price - 1);
        $price_arr[] = $price_str;
        $prev_step = $price;
    }
    $price_arr[] = '$' . end($price_steps) . "+";

    return $price_arr;
}

print_r(prices());

以前的结果:

Array
(
    [0] => $0 - $49
    [1] => $50 - $99
    [2] => $100 - $249
    [3] => $250 - $499
    [4] => $500 - $999
    [5] => $1000 - $2499
    [6] => $2500 - $4999
    [7] => $5000 - $9999
    [8] => $10000 - $24999
    [9] => $25000 - $49999
    [10] => $50000 - $99999
    [11] => $100000+
)

解决方法

for循环中的$e增量器更多是一段时间(1)无限循环.

因此,在Pow()中滥用增量器,通过每次迭代乘以一次来自行执行pow.调用pow()可能相当昂贵,因此执行自己的pow计算会更好地将乘法分配到每次迭代.

编辑:以下是您的函数的变体,它在迭代上分配pow()计算.此外,它执行更适当的变量初始化(例如,未设置返回值),如果$min和$max被交换并发出通知,则使用abs代替您的三元组,如果为log提供了无效值,则会抛出异常(),重命名一些变量,并将$num作为键首先添加到返回值,以便在最后使用array_unique操作:

/**
 * @param int $min
 * @param int $max
 * @param array $steps
 * @param int $jmp
 * @return array range
 */
function range_multistep($min,$jmp = 10) {
    $range = array();
    if (!$steps) return $range;

    if ($min < $max) {
       trigger_error(__FUNCTION__.'(): Minima and Maxima mal-aligned.',E_USER_NOTICE);
       list($max,$min) = array($min,$max);
    }

    $steps = array_unique($steps);
    sort($steps,SORT_NUMERIC);

    $bigstep = abs($jmp);
    if ($bigstep === 0) {
        throw new InvalidargumentException(sprintf('Value %d is invalid for jmp',$jmp));
    }

    $inITExponent = ($min > 0) ? floor(log($min,$bigstep)) : 0;

    for ($multiplier = pow($bigstep,$initExponent); ; $multiplier *= $bigstep) {
        foreach ($steps as $step) {
            $num = $step * $multiplier;
            if ($num  > $max) {
                break 2;
            } elseif ($num >= $min) {
                $range[$num] = 1;
            }
        }
    }

    $range = array_keys($range);
    sort($range,SORT_NUMERIC);

    return $range;
}

如果您感觉有实验性,也可以将两个循环(对于foreach)转换为一个循环,但代码可读性不会从中受益:

for(
    $multiplier = pow($bigstep,$initExponent),$step = reset($steps)
        ;
    $num = $step * $multiplier,$num <= $max
        ;
    # infinite array iterator:
    ($step=next($steps))?:
    (
      $step=reset($steps)
      # with reset exPression:
      AND $multiplier *= $bigstep
    )
){
    if ($num >= $min)
        $range[$num] = 1;
}

我想如果你注意不要重复使用变量(比如函数参数)并让它们更好地读取名称,那么改进就是它自己的.

@H_502_2@

脚本宝典总结

以上是脚本宝典为你收集整理的php – 生成一个不规则步骤的范围.优化全部内容,希望文章能够帮你解决php – 生成一个不规则步骤的范围.优化所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。