Задать вопрос

Рекурсия и array_merge — как не использовать его в цикле?

Есть компании, у них есть подкомпании, у тех еще подкомпании и т.д.. Нужно рекурсивно собрать все айдишники подкомпаний заданной компании. Написал такую функцию, но мне плагин PHP Inspections пишет, что array_merge нельзя юзать в цикле, т. к. он жутко медленный.
Как же избавиться от array_merge в цикле, если в случае с индексированными массивами оператор + (+=) не катит?

/**
     * Recursively get all sub-companies IDs
     */
    private function getSubcompaniesIds(CompanyInterface $company): array
    {
        $ids = [];

        $childCompanies = $this->companyRelationsResolver->getChildCompanies($company)->getItems();

        foreach ($childCompanies as $childCompany) {
            $ids[] = $childCompany->getId();
            $ids = array_merge($ids, $this->{__FUNCTION__}($childCompany));
        }

        return $ids;
    }
  • Вопрос задан
  • 184 просмотра
Подписаться 1 Простой 4 комментария
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
Audiophile
@Audiophile Автор вопроса
Спасибо Adamos за подсказки

/**
     * Recursively get all sub-companies IDs
     */
    private function getSubcompaniesIds(CompanyInterface $company): array
    {
        $ids = [];

        ($recursive = function ($company) use (&$ids, &$recursive) {
            $childCompanies = $this->companyRelationsResolver->getChildCompanies($company)->getItems();

            foreach ($childCompanies as $childCompany) {
                $ids[] = $childCompany->getId();
                $recursive($childCompany);
            }
        })($company);
        

        return $ids;
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
/**
     * Recursively collects all sub-companies IDs into $list
     */
    private function getSubcompaniesIds(CompanyInterface $company, array &$list)
    {
        $childCompanies = $this->companyRelationsResolver->getChildCompanies($company)->getItems();
        foreach ($childCompanies as $childCompany) {
            $list[] = $childCompany->getId();
            $this->{__FUNCTION__}($childCompany, $list));
        }
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы