• Блог
  • Слияние массивов в цикле

Если вы работаете в PhpStorm и у вас установлен плагин Php Inspections (EA Extended), то вы обязательно увидите следующую картину при использовании функции array_merge в цикле:

Как видите, это не просто жёлтенький warning, а самая настоящая ошибка, выделенная красным. Что сразу портит благостную картину — красным подчёркивается и сам файл в дереве, что, конечно, не может не вызывать чувство дискомфорта и ощущение, что где-то накосячил. Конечно, эту инспекцию можно отключить, чтобы не раздражала. Но от этого проблема не исчезнет.

Если обратиться к описанию инспекции, то увидим такое объяснение:

Cлияние массивов в цикле происходит медленно и вызывает высокую загрузку ЦП.

Там же есть и решение. Оно заключается в следующем — нужно вынести вызов функции array_merge за пределы цикла.

Я сделал пару тестов для того, чтобы убедиться в этом. В первом случае сливаем массивы в цикле.

$data = [];
for ($i=1; $i <= 1000; $i++) {
    $data = array_merge($data, range(0,5));
}
// ------------------
Время: 0,0272 s
Память: 2.38 MB

Теперь сделаем как советует плагин — в цикле просто накапливаем данные, а после завершения цикла мёрджим их.

$data = [];
for ($i=1; $i <= 1000; $i++) {
    $data[] = range(0,5); 
}
$data = array_merge(...$data);
// ------------------
Время: 0,0003 s
Память: 2.52 MB

Думаю, всё достаточно наглядно. Время выполнения сократилось на 2 порядка. По нагрузке на CPU точных данных привести не могу. Но следуя логике (время работы сократилось) и убеждениям разработчиков плагина, она тоже должна значительно уменьшиться.

0   131

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.