@radio_mus

Как усовершенствовать функцию?

Здравствуйте. Есть функция, которая принимает запрос, проверяет наличие новых тегов, если таковые присутствуют добавляет в бд, получаем id и добавляем все в общий массив с индексами и в завершении синхронизируем.
Как бы вы сделали данную функцию?

public static function getTags($requestTags): array
{
    $tags = [];

    if ($requestTags) {
        foreach ($requestTags as $tag) {
            if (is_numeric($tag)) {
                $tags[] = $tag;
            } else {
                $newTag = Tag::upsert(['name' => $tag]);
                $tags[] = $newTag->id;
            }
        }
    }

    return $tags;
}


Можно ли, к примеру обойтись без форыча и воспользоваться стандартными функциями Php/Laravel?
  • Вопрос задан
  • 101 просмотр
Решения вопроса 2
SerafimArts
@SerafimArts
Senior Notepad Reader
return \collect((array)$requestTags)->map(function($tag): int {
    return \is_numeric($tag) ? (int)$tag : Tag::upsert(['name' => $tag])->id;
});
Ответ написан
gromdron
@gromdron
Работаю с Bitrix24
А что Вы в ней хотите усовершенствовать?
Ну например можно добавить typehint array у $requestTags и избавиться от проверки:

public static function getTags(array $requestTags): array
{
    $tags = [];

    foreach ($requestTags as $tag) {
        if (is_numeric($tag)) {
            $tags[] = $tag;
        } else {
            $newTag = Tag::upsert(['name' => $tag]);
            $tags[] = $newTag->id;
        }
    }

    return $tags;
}


Либо можно вынести в отдельную функицю сохранение тегов, например:

function mapTags( array &$value )
{
    if ( is_numeric($value) )
    {
        return $value;
    }

    $newTag = Tag::upsert(['name' => $tag]);
    return $newTag->id;
}


И тогда весь код метода свернется в:

public static function getTags( array $requestTags ): array
{
    return array_map('mapTags', $requestTags);
}


Можно просто уменьшить вложенность оставив скрипт (меньше уровней будет):

public static function getTags($requestTags): array
{
    $tags = [];

    if ( !$requestTags )
    {
        return $tags;
    }

    foreach ($requestTags as $tag) {
        if (is_numeric($tag)) {
            $tags[] = $tag;
        } else {
            $newTag = Tag::upsert(['name' => $tag]);
            $tags[] = $newTag->id;
        }
    }

    return $tags;
}


Если это очень частовыполняемая операция, то можно сэкономить на запросах:

public static function getTags(array $requestTags): array
{
    if ( empty($requestTags) )
    {
        return $requestTags;
    }

    $existedTags = array_filter($requestTags, 'is_numeric');
    $newTags = array_diff($requestTags, $existedTags);

    /**
     * Тут единый batch-метод который отправляет 
     * 1 запрос на все теги сразу.
     * В results - массив Tag, обработанных batch-методом
     */
    foreach ($results as $tag)
    {
        $existedTags[] = $tag->id;
    }

    return array_unique($existedTags);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы