Долгое время выполнения с foreach и array keys

Рейтинг: 0Ответов: 1Опубликовано: 20.07.2023

Есть код:

// массив для примера
$array = [
    '0' => 'a',
    '1' => 'b',
    '2' => 'c',
    '3' => 'b',
    '4' => 'a',
    '5' => 'a',
    '6' => 'a',
    '7' => 'b'
    ];
/* нужно получить 
$result = [
'a' => 
['0', '4', '5', '6'],
'b' => ['1', '3', '7'],
'c' => ['2']
];
*/
$list = [];
foreach ($array as $key => $value) {
            $time = hrtime(true);
            if (!in_array($key, $list)) {
                $idArr = array_keys($array, $value, true);
                $result[$value] = $idArr;
                foreach ($idArr as $item) {
                    $list[] = $item;
                }
            }
            echo ((hrtime(true) - $time)/1000000000).';      ';
        }

hrtime выводит 0.0015127

В моем настоящем массиве (сверху указан просто пример) 93026 элементов.

Таким образом время выполнения составляет 0.0015127*93026=140.7204302 сек

Через $list и проверку in_array получилось сократить время выполнения до 30 сек, что всё ещё долго.

Есть ли способы сократить время выполнения? Или просто оставить всё как есть?

Заранее спасибо за ответы.

Ответы

▲ 3Принят

Вы немножко намудрили, если я все правильно понял, то Вам нужно просто сгрупировать ключи исходного массива по значениям. Можно сделать таким образом:

<?php
$array = array_fill(0, 10000, rand(0, 10));
$result = [];

foreach ($array as $key => $value) {
    $result[$value][] = $key;
}

print_r($result);