• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 你知道Laravel Collection的实际使用场景什么吗?

你知道Laravel Collection的实际使用场景什么吗?

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了Laravel Collection等相关知识,希望对您有所帮助

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


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');



分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2022-04-29PS制作逼真的蕾丝花边文字效果的教程
  • 2022-04-29微信小程序发布新版本时自动提示用户更新的方法
  • 2022-04-29css中实现背景透明的三种方式
  • 2022-04-29CorelDraw制作可爱的彩色塑料字教程
  • 2022-04-29简单聊聊Redis中GETBIT和SETBIT
  • 2022-04-29jquery怎么判断指定子元素是否存在
  • 2022-04-29苹果CMS按星期几调用信息教程
  • 2022-04-29网站设计怎么才能真正体现企业形象
  • 2022-04-29如何解决mysql 错误1053问题
  • 2022-04-29详解Node.js Buffer的使用

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • javascript调试之console.table()
    • 如何利用PHP来输出一个杨辉三角
    • 百度编辑器无法插入视频、iframe怎么办
    • 在Javascript中如何利用filter()对数据进行筛选
    • 详解在TP中怎么引入ThinkWechat.php并打印日志
    • MySQL主键还需要建立索引吗?
    • Photoshop多边形套索工具无法闭合BUG(单击,双击,Esc,回车)均无效的解决办法
    • node_modules中如何优雅的修改依赖库?方法介绍
    • Photoshop制作光滑的金色发光字
    • PS制作常用水晶按钮

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有