您认为我可以优化这段PHP代码吗? 此代码按范围对数组进行排序,因为脚本将在30000次迭代的循环中打开。
IN
Array
(
[0] => 39.89
[1] => 49.62
[2] => 59
[3] => 70.9
[4] => 82
[5] => 109.2
[6] => 120
[7] => 138
)
LOOP
$newArr = [];
foreach ($formField['surface_m2'] as $key => $surface) {
if (substr($surface, -1) < 5){
$value = floor($surface / 10) *10;
} else{
$value = ceil($surface / 10) *10;
$value -= 10;
}
if(!empty($newArr[$value])){
$newArr[$value][] = $surface;
}else{
$newArr[$value] = [];
$newArr[$value][] = $surface;
}
}
OUT
Array(
[30] => Array( [0] => 39.89 )
[40] => Array( [0] => 49.62 )
[50] => Array( [0] => 59 )
[70] => Array( [0] => 70.9 )
[80] => Array( [0] => 82 )
[100] => Array( [0] => 109.2 )
[120] => Array( [0] => 120 )
[130] => Array( [0] => 138 )
)
答案 0 :(得分:6)
赞:
foreach ($formField['surface_m2'] as $number) {
$newArr[$number - $number % 10][] = $number;
}
从数字中减去$number % 10
将导致数字被截断为十位数。
ksort($newArr);
用于按键对组进行排序。
对组进行排序:
foreach ($newArr as &$group) {
sort($group);
}
不过,对整个数组进行分组之前仅sort()
可能会更有效率。我不确定。
实际上,我很好奇,所以我做了一些测试,对于较小的数组(计数<300),在分组之前进行排序似乎更快,但是对于较大的数组,排序却较慢。不过,差异不大(≈10%)。
答案 1 :(得分:5)
$newArr = [];
foreach($in as $surface) {
$key = (int) ($surface/10)*10;
$newArr[$key] []= $surface;
}
通过强制转换为int,该值将四舍五入。然后将其添加到$ newArr中的相应帖子中。通过这种方式,PHP“假定”它应该以一个空数组开始。
答案 2 :(得分:1)
我会更喜欢array_reduce()
来完成这项任务,让我们像这样-
<?php
$array = array(39.89,49.62,59,70.9,82,109.2,120,138);
$results = array_reduce($array, function ($result, $n) {
$result[floor($n / 10) * 10] = [$n];
return $result;
}, array());
print_r($results);
?>