Как удалить вложенные массивы с помощью функции merge?

Как можно избежать повторного использования функции array_merge внутри цикла? Я хочу собрать массивы в процессе выполнения цикла и объединить их в один массив после завершения цикла. Вот код, который нужно улучшить: <br/> <pre><code class="php">foreach ($contentIds as $contentId) {
                $commentsLists = array_merge($commentsLists, $this-&gt;commentGetter-&gt;getCommentsFromStorage(...)
                ));
}</code></pre>
  • 3 февраля 2025 г. 12:54
Ответы на вопрос 2
Чтобы избежать повторного использования функции `array_merge` внутри цикла и собрать массивы в процессе выполнения, можно использовать обычный массив для хранения всех полученных комментариев и объединять их в один массив один раз после завершения цикла. Вместо того чтобы каждый раз сливать массивы, можно просто добавлять их в общий массив.

Вот как вы можете улучшить ваш код:

```php
$commentsLists = [];

foreach ($contentIds as $contentId) {
    // Получаем список комментариев в виде массива
    $fetchedComments = $this->commentGetter->getCommentsFromStorage($contentId);

    // Сливаем полученные комментарии с общим массивом
    $commentsLists = array_merge($commentsLists, $fetchedComments);
}
```

Однако, чтобы минимизировать количество вызовов `array_merge`, вы можете использовать `array_push` или просто обращения по ссылке:

```php
$commentsLists = [];

foreach ($contentIds as $contentId) {
    // Получаем список комментариев в виде массива
    $fetchedComments = $this->commentGetter->getCommentsFromStorage($contentId);

    // Сливаем массивы, используя оператор '[]'
    foreach ($fetchedComments as $comment) {
        $commentsLists[] = $comment;
    }
}
```

В этом примере мы добавляем каждый комментарий в массив `$commentsLists` без необходимости постоянно выполнять операцию `array_merge`. Это может быть более эффективно, особенно если ваши массивы имеют значительные размеры. Если вы хотите предотвратить дублирование комментариев, вы можете использовать `array_unique` на конечном массиве:

```php
$commentsLists = [];

foreach ($contentIds as $contentId) {
    $fetchedComments = $this->commentGetter->getCommentsFromStorage($contentId);

    foreach ($fetchedComments as $comment) {
        $commentsLists[] = $comment;
    }
}

// Удаляем дубликаты, если необходимо
$commentsLists = array_unique($commentsLists, SORT_REGULAR);
```

Таким образом, код станет более оптимальным, а структура данных останется понятной.
Вот оптимизированный вариант без вложенного array_merge в цикле. Мы сначала собираем все массивы в промежуточный буфер, а потом делаем одно объединение: <br/> <pre><code class="php">// Инициализируем массив для сбора всех результатов
$tempArrays = [];

foreach ($contentIds as $contentId) {
    // Собираем массивы в буфер
    $tempArrays[] = $this-&gt;commentGetter-&gt;getCommentsRedis(...);
}</code></pre> <br/> <br/> <pre><code class="php">// Объединяем все массивы за один вызов
$commentsLists = array_merge([], ...$tempArrays);</code></pre> <br/> Пояснения: <br/> <br/> Буферизация массивов: <br/> Вместо постоянного пересоздания массива через array_merge в каждой итерации, мы сохраняем отдельные массивы комментариев в промежуточный массив $tempArrays. <br/> <br/> Распаковка оператором ...: <br/> Используем spread operator (...), чтобы "развернуть" вложенные массивы в аргументы для array_merge. <br/> <br/> Производительность: <br/> Объединение за один вызов работает значительно быстрее, особенно для больших наборов данных (сложность O(n) вместо O(n²)). <br/> <br/> Дополнительные улучшения: <br/> <br/> Если нужно фильтровать пустые результаты: <br/> <br/> <pre><code class="php">$tempArrays = [];
foreach ($contentIds as $contentId) {
    $comments = $this-&gt;commentGetter-&gt;getCommentsRedis(...);
    if (!empty($comments)) {
        $tempArrays[] = $comments;
    }
}</code></pre> <br/> Для PHP 8.1+ можно использовать array_is_list() проверку: <br/> <br/> <pre><code class="php">if (is_array($comments) &amp;&amp; array_is_list($comments)) {
    $tempArrays[] = $comments;
}</code></pre> Если getCommentsRedis() может возвращать null, добавьте приведение типов: <br/> <br/> <pre><code class="php">$tempArrays[] = (array)$this-&gt;commentGetter-&gt;getCommentsRedis(...);</code></pre>
Похожие вопросы