Фильтрация по коллекции и добавление значений в случае совпадения пар ключ => значение - PullRequest
1 голос
/ 12 марта 2020

Я совершенно новичок в PHP & Laravel, и мне было дано следующее задание: у меня есть коллекция, похожая на приведенную ниже:

   Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 1
                    [cardId] => 100
                    [cardQuantity] => 1234      
                )

            [1] => stdClass Object
                (
                    [id] => 2
                    [cardId] => 100
                    [cardQuantity] => 1234            
                )

            [2] => stdClass Object
                (
                    [id] => 7
                    [cardId] => 200
                    [cardQuantity] => 1234   
                )

            [3] => stdClass Object
                        (
                    [id] => 8
                    [cardId] => 200
                    [cardQuantity] => 1234   
                )   
        )

)

, и я должен отфильтруйте каждый элемент на основе параметра cardId, добавьте (+) параметр cardQuantity, а затем верните новые отдельные массивы, которые выглядят следующим образом:

  (
     [id] => 10
     [cardId] => 100
     [cardQuantity] => 2468      
  )
  (
     [id] => 11
     [cardId] => 200
     [cardQuantity] => 2468      
  )

Как этого добиться?

1 Ответ

1 голос
/ 12 марта 2020

Вы можете иметь представление о том, как добиться этого, попробовав что-то вроде этого:

$collection = collect([
    ['id' => 1, 'cardId' => 100, 'cardQuantity' => 1234],
    ['id' => 2, 'cardId' => 100, 'cardQuantity' => 1234],
    ['id' => 7, 'cardId' => 200, 'cardQuantity' => 1234],
    ['id' => 8, 'cardId' => 200, 'cardQuantity' => 1234],
]);

$unique = $collection->unique('cardId'); // returns a collection

$unique->transform(function ($item, $key) use ($collection) {
    $id = $item['cardId'];

    $item['cardQuantity'] = $collection->sum(function ($product) use ($id) {
        if($product['cardId'] == $id){
            return $product['cardQuantity'];
        }
    });
    return $item;
});
return $unique->all();

В результате этот код возвращает преобразованную уникальную коллекцию:

{
    "0": {
        "id": 1,
        "cardId": 100,
        "cardQuantity": 2468
    },
    "2": {
        "id": 7,
        "cardId": 200,
        "cardQuantity": 2468
    }
}

По сути, сначала мы получаем уникальные значения с помощью клавиши cardId, после чего мы transform собираем unique коллекцию, устанавливая ее новые значения (сумму уникальных значений). Вы можете играть и проверить больше способов сделать это. Надеюсь, вы найдете это полезным.

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