首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按范围10×10排序数组

按范围10×10排序数组
EN

Stack Overflow用户
提问于 2019-02-15 15:40:59
回答 3查看 116关注 0票数 2

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

IN

代码语言:javascript
运行
复制
Array
(
[0] => 39.89
[1] => 49.62
[2] => 59
[3] => 70.9
[4] => 82
[5] => 109.2
[6] => 120
[7] => 138
)

代码语言:javascript
运行
复制
    $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

代码语言:javascript
运行
复制
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 )
)
EN

回答 3

Stack Overflow用户

发布于 2019-02-15 15:53:43

如下所示:

代码语言:javascript
运行
复制
foreach ($formField['surface_m2'] as $number) {
    $newArr[$number - $number % 10][] = $number;
}

从数字中减去$number % 10将导致将数字截断到tens位置。

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

并对这些群体进行分类:

代码语言:javascript
运行
复制
foreach ($newArr as &$group) {
    sort($group);
}

不过,在对整个数组进行分组之前,只对其进行sort()可能会更有效。我没有把握。

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

票数 6
EN

Stack Overflow用户

发布于 2019-02-15 15:54:37

代码语言:javascript
运行
复制
$newArr = [];
foreach($in as $surface) {
    $key = (int) ($surface/10)*10;
    $newArr[$key] []= $surface;
}

通过转换到int,值被四舍五入。然后将其添加到$newArr中的相应帖子中。这样做,PHP“假设”它应该从一个空数组开始。

票数 5
EN

Stack Overflow用户

发布于 2019-02-15 16:01:42

我更喜欢array_reduce()来完成这个任务,让我们像-

代码语言:javascript
运行
复制
<?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);
?> 

演示: https://3v4l.org/e5kgH

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54712617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档