按10到10的范围对数组进行排序

Sco*_*Sco 2 php arrays sorting range

你认为我可以优化这段PHP代码吗?此代码按范围对数组进行排序,因为脚本将在30000次迭代的循环中打开.

Array
(
[0] => 39.89
[1] => 49.62
[2] => 59
[3] => 70.9
[4] => 82
[5] => 109.2
[6] => 120
[7] => 138
)
Run Code Online (Sandbox Code Playgroud)

    $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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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 )
)
Run Code Online (Sandbox Code Playgroud)

Don*_*nic 6

像这样:

foreach ($formField['surface_m2'] as $number) {
    $newArr[$number - $number % 10][] = $number;
}
Run Code Online (Sandbox Code Playgroud)

$number % 10从数字中减去将导致数字截断到十位.

ksort($newArr); 如果需要对组进行排序,请按键对组进行排序.

并对组进行排序:

foreach ($newArr as &$group) {
    sort($group);
}
Run Code Online (Sandbox Code Playgroud)

但是,在sort()对整个阵列进行分组之前,它可能更有效.我不确定.


实际上,我很好奇所以我做了一些测试,对于较小的数组(计数<300),分组前的排序似乎更快,但对于较大的数组则更慢.但这并没有太大的区别(≈10%).


小智 5

$newArr = [];
foreach($in as $surface) {
    $key = (int) ($surface/10)*10;
    $newArr[$key] []= $surface;
}
Run Code Online (Sandbox Code Playgroud)

通过转换为int,值向下舍入.然后将其添加到$ newArr中的相应帖子中.以这种方式完成PHP"假设"它应该从一个空数组开始.