你知道Laravel Collection的实际使用场景有哪些吗?

2022-05-15 0 681

下面由Laravel教程栏目给大家介绍Laravel Collection的实际使用场景,希望对需要的朋友有所帮助!

这篇笔记用来整理Collection 在Laravel 的实际应用场景。

求和

需求:遍历$orders 数组,求price 的和。

<?php// 引入packagerequire __DIR__ . '/vendor/autoload.php';$orders = [[    'id'            =>      1,    'user_id'       =>      1,    'number'        =>      '13908080808',    'status'        =>      0,    'fee'           =>      10,    'discount'      =>      44,    'order_products'=> [        ['order_id'=>1,'product_id'=>1,'param'=>'6寸','price'=>555.00,'product'=>['id'=>1,'name'=>'蛋糕名称','images'=>[]]],        ['order_id'=>1,'product_id'=>1,'param'=>'7寸','price'=>333.00,'product'=>['id'=>1,'name'=>'蛋糕名称','images'=>[]]],    ],]];

1.使用传统的foreach 方式进行遍历:

$sum = 0;foreach ($orders as $order) {    foreach ($order['order_products'] as $item) {        $sum += $item['price'];    }}echo $sum;

2.使用集合的map、flatten、sum:

$sum = collect($orders)->map(function($order){    return $order['order_products'];})->flatten(1)->map(function($order){    return $order['price'];})->sum();echo $sum;

map:遍历集合,返回一个新的集合。
flatten:将多维数组转换为一维。
sum:返回数组的和。

3.使用集合的flatMap、pluck、sum:

$sum = collect($orders)->flatMap(function($order){    return $order['order_products'];})->pluck('price')->sum();echo $sum;

flatMap:和map 类似,不过区别在于flatMap 可以直接使用返回的新集合。

4.使用集合的flatMap、sum:

$sum = collect($orders)->flatMap(function($order){    return $order['order_products'];})->sum('price');

sum:可以接收一个列名作为参数进行求和。

格式化数据

需求:将如下结构的数组,格式化成下面的新数组。

// 带格式化数组$gates = [    'BaiYun_A_A17',    'BeiJing_J7',    'ShuangLiu_K203',    'HongQiao_A157',    'A2',    'BaiYun_B_B230'];// 新数组$boards = [    'A17',    'J7',    'K203',    'A157',    'A2',    'B230'];

1.使用foreach 进行遍历:

$res = [];foreach($gates as $key => $gate) {    if(strpos($gate, '_') === false) {        $res[$key] = $gate;    }else{        $offset = strrpos($gate, '_') + 1;        $res[$key] = mb_substr($gate , $offset);    }}var_dump($res);

2.使用集合的map以及php 的explode、end:

$res = collect($gates)->map(function($gate) {    $parts = explode('_', $gate);    return end($parts);});

3.使用集合的map、explode、last、toArray:

$res = collect($gates)->map(function($gate) {    return collect(explode('_', $gate))->last();})->toArray();

explode:将字符串进行分割成数组
last:获取最后一个元素

统计GitHub Event

首先,通过此链接获取到个人事件json。

一个 PushEvent计 5 分,一个 CreateEvent 计 4 分,一个 IssueCommentEvent计 3 分,一个 IssueCommentEvent 计 2 分,除此之外的其它类型的事件计 1 分,计算当前用户的时间得分总和。

$opts = [        'http' => [                'method' => 'GET',                'header' => [                        'User-Agent: PHP'                ]        ]];$context = stream_context_create($opts);$events = json_decode(file_get_contents('http://api.github.com/users/0xAiKang/events', false, $context), true);

1.传统foreach 方式:

$eventTypes = []; // 事件类型$score = 0; // 总得分foreach ($events as $event) {    $eventTypes[] = $event['type'];}foreach($eventTypes as $eventType) {    switch ($eventType) {        case 'PushEvent':        $score += 5;        break;        case 'CreateEvent':        $score += 4;        break;        case 'IssueEvent':        $score += 3;        break;        case 'IssueCommentEvent':        $score += 2;        break;        default:        $score += 1;        break;    }}

2.使用集合的map、pluck、sum 方法:

$score = $events->pluck('type')->map(function($eventType) {   switch ($eventType) {      case 'PushEvent':      return 5;      case 'CreateEvent':      return 4;      case 'IssueEvent':      return 3;      case 'IssueCommentEvent':      return 2;      default:      return 1;  }})->sum();

使用集合的链式编程,可以很好地解决上面那种多次遍历的问题。

3.使用集合中的map、pluck、get 方法:

$score = $events->pluck('type')->map(function($eventType) {   return collect([       'PushEvent'=> 5,       'CreateEvent'=> 4,       'IssueEvent'=> 3,       'IssueCommentEvent'=> 2   ])->get($eventType, 1); // 如果不存在则默认等于1})->sum();

4.尝试将该需求,封装成一个类:

class GithubScore {    private $events;    private function __construct($events){        $this->events = $events;    }    public static function score($events) {        return (new static($events))->scoreEvents();    }    private function scoreEvents() {        return $this->events->pluck('type')->map(function($eventType){            return $this->lookupEventScore($eventType, 1);        })->sum();    }    public function lookupEventScore($eventType, $default_value) {       return collect([           'PushEvent'=> 5,           'CreateEvent'=> 4,           'IssueEvent'=> 3,           'IssueCommentEvent'=> 2       ])->get($eventType, $default_value); // 如果不存在则默认等于1    }}var_dump(GithubScore::score($events));

格式化数据

需求:将以下数据格式化成新的结构。

$messages = [    'Should be working now for all Providers.',    'If you see one where spaces are in the title let me know.',    'But there should not have blank in the key of config or .env file.'];// 格式化之后的结果- Should be working now for all Providers. \\n- If you see one where spaces are in the title let me know. \\n- But there should not have blank in the key of config or .env file.

1.传统的foreach 方式:

$comment = '- ' . array_shift($messages);foreach ($messages as $message) {    $comment .= "\\n -  ${message}";}var_dump($comment);

2.使用集合的map、implode方法:

$comment = collect($messages)->map(function($message){    return '- ' . $message;})->implode("\\n");var_dump($comment);

多个数组求差

需求:两组数据分别代表去年的营收和今年的营收,求每个月的盈亏情况。

$lastYear = [    6345.75,    9839.45,    7134.60,    9479.50,    9928.0,    8652.00,    7658.40,    10245.40,    7889.40,    3892.40,    3638.40,    2339.40];$thisYear = [    6145.75,    6895.00,    3434.00,    9349350,    9478.60,    7652.80,    4758.40,    10945.40,    3689.40,    8992.40,    7588.40,    2239.40];

1.传统的foreach 方式:

$profit = [];foreach($thisYear as $key => $monthly){    $profit[$key] = $monthly - $lastYear[$key];}var_dump($profit);

2.使用集合的zip、first、last:

$profit = collect($thisYear)->zip($lastYear)->map(function($monthly){    return $monthly->first() - $monthly->last();});

zip:将给定数组的值与相应索引处的原集合的值合并在一起。

创建lookup 数组

需求:将如下数组格式化成下面的结果:

$employees = [    [        'name' => 'example',        'email' => 'example@exmaple.com',        'company' => 'example Inc.'    ],    [        'name' => 'Lucy',        'email' => 'lucy@example.com',        'company' => 'ibm Inc.'    ],    [        'name' => 'Taylor',        'email' => 'toylor@laravel.com',        'company'=>'Laravel Inc.'    ]];// 格式化之后的结果$lookup = [    'example' => 'example@example.com',    'Lucy' => ‘lucy@example.com’,    'Taylor'=> 'toylor@laravel.com'];

1.传统的foreach 方式:

$emails = [];foreach ($employees as $key => $value) {    $emails[$value['name']] = $value['email'];}

2.使用集合的reduce 方法:

$emails = collect($employees)->reduce(function($emailLookup, $employee){    $emailLookup[$employee['name']] = $employee['email'];    return $emailLookup;},[]);

reduce:将每次迭代的结果传递给下一次迭代直到集合减少为单个值。

3.使用集合的pluck 方法:

$emails = collect($employees)->pluck('name', 'email');

相关推荐:最新的五个Laravel视频教程

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 你知道Laravel Collection的实际使用场景有哪些吗? https://www.jike1995.com/37092.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务