Как установить аддитивный параметр для метода карты коллекции Laravel - PullRequest
1 голос
/ 25 июня 2019

В моем laravel 5.7 я пытаюсь переделать небольшой кусочек приложения, используя коллекцию

$selectedSubscriptions = [1,2,3];
$siteSubscriptionsList = [];
$siteSubscriptions     = SiteSubscription
    ::getByActive(true)
    ->orderBy('id', 'asc')
    ->get();
foreach ($siteSubscriptions as $next_key => $nextSiteSubscription) {
    $is_found = false;
    foreach ($selectedSubscriptions as $next_value) {
        if ($nextSiteSubscription->id == (int)$next_value) {
            $is_found = true;
            break;
        }
    }
    $siteSubscriptionsList[] = (object)['name' => $nextSiteSubscription->name, 'id' => $nextSiteSubscription->id, 'checked' => $is_found];
}

нравится:

$selectedSubscriptions = [1,2,3];
$siteSubscriptionsList     = SiteSubscription
    ::getByActive(true)
    ->orderBy('id', 'asc')
    ->get()
    ->map(function ( $item, $selectedSubscriptions ) {
        $is_found = false;
        foreach ($selectedSubscriptions as $next_value) {
            if ($item->id == (int)$next_value) {
                $is_found = true;
                break;
            }
        }
        return (object)['name' => $item->name, 'id' => $item->id, 'checked' => $is_found];

    })
    ->all();

Но мне нужно установить аддитивный параметр $ selectedSubscription в функцию карты, поскольку она не работает, так как я вижу, что внутри карты функция имеет значение «0». Как правильно?

1 Ответ

4 голосов
/ 25 июня 2019

При передаче данных в замыкание ->map() используется оператор use (который следует за вызовом function()):

$selectedSubscriptions = [1,2,3];
$siteSubscriptionsList = SiteSubscription
    ::getByActive(true)
    ->orderBy('id', 'asc')
    ->get()
    ->map(function ($item, $key) use ($selectedSubscriptions) {
        $is_found = false;
        foreach ($selectedSubscriptions as $next_value) {
            if ($item->id == (int)$next_value) {
                $is_found = true;
                break;
            }
        }
        return (object)['name' => $item->name, 'id' => $item->id, 'checked' => $is_found];

    })
    ->all();

Второй параметр ->map() всегда будет переменной $key.

Sidenote: Вы можете уменьшить foreach проверку идентификатора следующим образом:

$is_found = collect($selectedSubscriptions)->contains($item->id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...