php – 生成一个不规则步骤的范围.优化
发布时间:2020-12-13 16:23:06 所属栏目:PHP教程 来源:网络整理
导读:PHP是否具有针对不规则步长范围的现有功能,是否存在提供此功能的通用解决方案,或者如何优化以下功能? 第一个功能是我关注的功能.第二个函数是一个真实世界的用例,它生成一个数组来填充输出HTML选择下拉列表的函数的值. ?phpfunction range_multistep($min,$
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; } 我想如果你注意不要重复使用变量(比如函数参数)并让它们更好地读取名称,那么改进就是它自己的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |