PHP如何计算不规则范围,php – 生成一个不规则步骤的范围.优化

本文探讨了如何在PHP中优化for循环,尤其是当涉及到pow()函数时,提出了一种通过手动执行指数运算来减少pow()调用的方法。文章提供了一个改进的range_multistep()函数示例,该函数在迭代过程中分配pow计算,同时考虑了错误检查、边界条件和性能优化。此外,还讨论了将双重循环转换为单一循环的可能性,虽然这可能影响代码的可读性。
摘要由CSDN通过智能技术生成

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, $max, Array $steps, $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;

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值