Сортировать массив по диапазону 10 на 10 - PullRequest
0 голосов
/ 15 февраля 2019

Как вы думаете, я могу оптимизировать этот кусок кода 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 )
)

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019
$newArr = [];
foreach($in as $surface) {
    $key = (int) ($surface/10)*10;
    $newArr[$key] []= $surface;
}

При приведении к int значение округляется в меньшую сторону.Затем он добавляется в соответствующий пост в $ newArr.Сделано так, что PHP «предполагает», что он должен начинаться с пустого массива.

0 голосов
/ 15 февраля 2019

Я предпочитаю 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);
?> 

DEMO: https://3v4l.org/e5kgH

0 голосов
/ 15 февраля 2019

Например:

foreach ($formField['surface_m2'] as $number) {
    $newArr[$number - $number % 10][] = $number;
}

Вычитание $number % 10 из числа приведет к усечению числа до десятка.

ksort($newArr); для сортировки групп по ключам, если вынужно, чтобы он был отсортирован.

И для сортировки групп:

foreach ($newArr as &$group) {
    sort($group);
}

Однако может быть эффективнее просто sort() весь массив перед группировкой.Я не уверен.


На самом деле, мне было любопытно, поэтому я провел некоторое тестирование, и сортировка перед группировкой кажется более быстрой для меньших массивов (количество <300), но медленнее для больших массивов.Это не большая разница, хотя (≈10%). </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...