Php arrayToCollection - PullRequest
       2

Php arrayToCollection

0 голосов
/ 14 ноября 2018

У меня проблема с кодом ниже.Я не понимаю, как это работает.Я родом из Java, и эта функция мне кажется странной.В первом параметре он возвращает результат, а во втором параметре возвращает список.

 private static function getEventsOfTheCampaigns($campaigns)
        {
            $events = Utility::arrayToCollection(array_map(function ($id) {
                return Events::find($id);
            }, array_unique(Utility::getIndexFromCollection($campaigns, 'event_id'))));
            return $events;
        }

Определение функций ниже

 public static function arrayToCollection(array $list){

    $result = collect([]);

    if( !is_null($list) ):

        if(is_array( $list ) and count($list) > 0):

            foreach($list as $item):

                $result->push($item);

            endforeach;

        endif;

    endif;

    return $result;
}

Может кто-нибудь объяснить мне, как это работает?спасибо.

1 Ответ

0 голосов
/ 15 ноября 2018

Вот что происходит, когда вы запускаете getEventsOfTheCampaigns() пошагово:

  1. $campaigns передается сначала Utility::getIndexFromCollection().Вы не опубликовали код, поэтому я не уверен, что эта функция делает, но исходя из того, что будет дальше, я предполагаю, что она возвращает массив идентификаторов событий.

  2. Результат (1) передается в array_unique().Это отфильтровывает любые повторяющиеся значения в массиве: http://php.net/manual/en/function.array-unique.php

  3. Отфильтрованный массив из (2) передается как второй параметр в array_map(), который выполняет итерацию по массиву, выполняет заданный обратный вызовФункция для каждого элемента, и возвращает новый массив со значениями, которые являются результатом обратного вызова.Первым параметром array_map() является функция обратного вызова, которая в этом случае возвращает Events::find($id).Таким образом, результатом будет массив, содержащий все найденные события.http://php.net/manual/en/function.array-map.php

  4. Массив событий из (3) затем передается в Utility::arrayToCollection(), и эта функция выглядит так, как будто она принимает массив и помещает все элементы в коллекцию.

  5. Возвращается коллекция событий.

Но функция могла бы лучше использовать методы сбора данных Laravel.Вы можете превратить массив в коллекцию, передав его в функцию collect():

https://laravel.com/docs/5.7/collections

Например:

private static function getEventsOfTheCampaigns($campaigns)
{
    // if $campaigns is not a collection, you can turn it into one like this:
    // $campaigns = collect($campaigns);

    // pluck the event_id from $campaigns
    $eventIds = $campaigns->pluck('event_id');

    // this is not required for what happens next, but you can filter the IDs if you want to
    // $eventIds = $eventIds->unique()->values();

    // if you pass a collection or array to the `find()` method, $events will be a collection by default
    $events = Events::find($eventIds);  

    return $events;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...