Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按范围10 x 10对数组排序_Php_Arrays_Sorting_Range - Fatal编程技术网

Php 按范围10 x 10对数组排序

Php 按范围10 x 10对数组排序,php,arrays,sorting,range,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 ) 循环 $newArr = []; foreach ($formField['surface_m2'] as $key

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

Array
(
[0] => 39.89
[1] => 49.62
[2] => 59
[3] => 70.9
[4] => 82
[5] => 109.2
[6] => 120
[7] => 138
)
循环

    $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;
        }
    }
像这样:

foreach ($formField['surface_m2'] as $number) {
    $newArr[$number - $number % 10][] = $number;
}
从数字中减去
$number%10
,将导致数字截断为十位

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

并对组进行排序:

foreach ($newArr as &$group) {
    sort($group);
}
不过,在对整个数组进行分组之前,只对其进行
sort()
可能更有效。我不确定


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


通过强制转换为int,值向下舍入。然后,它以$newArr的形式添加到相应的post中。这样做PHP“假设”它应该从一个空数组开始。

我更喜欢
array\u 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);
?> 


演示:

您是否遇到此代码的任何问题?一般来说,SO不用于优化建议。此外,我们肯定需要更多信息。例如,“$formField['surface_m2']”的定义在哪里?排序逻辑是什么?此脚本不会对任何内容进行排序。我投票结束此问题,因为这属于主题,因为您可能需要
[]
,因为这将在同一段中有多个元素时覆盖。非常感谢。我把任务复杂化了,而解决方案很简单。你也可以在
foreach()
之前对输入进行欺骗和排序-然后按顺序添加所有输入。@NigelRen哦,是的,我几分钟前在答案的末尾添加了这一点(尽管我可能会更明确地说明我的意思)。我不确定哪种方法运行得更快,但那肯定会是更简单的代码,我总是喜欢这样,除非它有很大的不同。谢谢。@Sco祝你好运:)与question@splash58哦,我的错,我只是误解了:(谢谢。@splash58先生编辑并使用了
array\u reduce()
$newArr = [];
foreach($in as $surface) {
    $key = (int) ($surface/10)*10;
    $newArr[$key] []= $surface;
}
<?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);
?>