Рекурсия и 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;
    }
  • Вопрос задан
  • 177 просмотров
Решения вопроса 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));
        }
    }
Ответ написан
Ваш ответ на вопрос

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

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