如何在Laravel 5.3中使用collect?

时间:2017-02-21 18:13:13

标签: laravel laravel-5.3 collect

我需要在Laravel 5.3中使用collect,但我需要帮助。

例如:

$collection = collect([
  'Apple' => [
      ['name' => 'iPhone 6S', 'price' => '200'],
      ['name' => 'iPhone 7S', 'price' => '250'],
  ],
  'Samsung' => [
      ['name' => 'Galaxy S7', 'price' => '300']
      ['name' => 'Galaxy note', 'price' => '150']
  ],
]);
  1. 如何通过收藏获得AppleSamsung名称?我需要获得品牌名称。
  2. 如何获得(名称和价格)每个品牌最便宜的价格。
  3. 谢谢: - )

2 个答案:

答案 0 :(得分:2)

您可以通过mapWithKeys

实现这一目标
/* First get the minimum price */

$min = $collection->flatten(1)->pluck('price')->min();

/* Then perform the filteration */

$final = $collection->mapWithKeys(function($value, $key) use ($min) {
    $result = collect($value)->filter(function($inner) use ($min){
        return $inner['price'] === $min;
    })->keys()->first();

    return $result ? [$key => $value[$result]]: [];
});

当您运行上述代码时,您将获得

Illuminate\Support\Collection Object
(
    [items:protected] => Array
        (
            [Samsung] => Array
                (
                    [name] => Galaxy note
                    [price] => 150
                )

        )

)

现在只需要做品牌名称

$final->keys()->first() // Samsung

获取型号名称

$final->pluck('name')->first() // Galaxy note

答案 1 :(得分:1)

您需要使用每个来通过外部数组并在内部数组中使用min来获得最低价格。然后,您必须搜索以查找索引并返回并使用它来获取名称/价格。按照这个速度,你可能最好编写一个自己阅读得更好的函数。

$collection->each(function ($item, $brand) {
    $minPrice = $item->min('price');
    $minIndex = $item->search(function ($item) use ($minPrice) { 
        return $item['price'] == $minPrice
    });
    echo $brand.' '.$item[$minIndex]['name']. ' '.$item[$minIndex]['price'];
});

你可能不得不收集内部物品,因为我不记得收集是否自动嵌套所有收藏品