本篇笔记用于整理Collection在Laravel中的实际应用场景。总和要求:遍历$orders数组并找到价格总和。1,'user_id'=>1,'number'=>'13908080808','status'=>0,'费用'=>10,'折扣'=>44,'order_products'=>[['order_id'=>1,'product_id'=>1,'param'=>'6inch','price'=>555.00,'product'=>['id'=>1,'name'=>'cakename','images'=>[]]],['order_id'=>1,'product_id'=>1,'param'=>'7inch','price'=>333.00,'product'=>['id'=>1,'name'=>'cakename','images'=>[]]],],]];使用传统的foreach方式遍历:$sum=0;foreach($ordersas$order){foreach($order['order_products']as$item){$sum+=$item['price'];}}回声$总和;使用集合映射、展平、求和:$sum=collect($orders)->map(function($order){return$order['order_products'];})->flatten(1)->map(function($order){return$order['price'];})->sum();echo$sum;map:遍历集合并返回一个新的集合flatten:将多维数组转换为一维。sum:返回数组的总和。FlatMap、pluck、使用集合求和:$sum=collect($orders)->flatMap(function($order){return$order['order_products'];})->pluck('price')->sum();echo$sum;flatMap:类似于map,不同的是flatMap可以直接使用返回的新集合。FlatMap和使用集合求和:$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'];使用foreach遍历:$res=[];foreach($gatesas$key=>$gate){if(strpos($gate,'_')===false){$res[$key]=$gate;}else{$offset=strrpos($gate,'_')+1;$res[$key]=mb_substr($gate,$offset);}}var_dump($res);使用集合的map和php的explode和end:$res=collect($gates)->map(function($gate){$parts=explode('_',$gate);returnend($parts);});使用集合的map、explode、last、toArray:$res=collect($gates)->map(function($gate){returncollect(explode('_',$gate))->last();})->toArray();explode:将字符串拆分成数组last:获取最后一个元素统计GitHubEvent首先通过这个链接获取个人事件json。PushEvent5分,CreateEvent4分,IssueCommentEvent3分,IssueCommentEvent2分,其他类型事件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);传系统foreach方式:$eventTypes=[];//事件类型$score=0;//总得分foreach($eventsas$event){$eventTypes[]=$event['type'];}foreach($eventTypesas$eventType){switch($eventType){case'PushEvent':$score+=5;休息;case'CreateEvent':$score+=4;休息;案例'IssueEvent':$score+=3;休息;case'IssueCommentEvent':$score+=2;休息;默认值:$score+=1;休息;}}使用集合的map、pluck、sum方法:$score=$events->pluck('type')->map(function($eventType){switch($eventType){case'PushEvent':return5;case'CreateEvent':返回4;案例'IssueEvent':返回3;case'IssueCommentEvent':返回2;默认值:返回1;}})->求和();使用集合的链式编程,可以很好的解决上面多次遍历的问题在集合中使用map、pluck和get方法:$score=$events->pluck('type')->map(function($eventType){returncollect(['PushEvent'=>5,'CreateEvent'=>4,'IssueEvent'=>3,'IssueCommentEvent'=>2])->get($eventType,1);//如果不存在则默认等于1})->sum();尝试将需求封装到一个类中:classGithubScore{private$events;私有函数__construct($events){$this->events=$events;}publicstaticfunctionscore($events){return(newstatic($events))->scoreEvents();}privatefunctionscoreEvents(){return$this->events->pluck('type')->map(function($eventType){return$this->lookupEventScore($eventType,1);})->sum();}publicfunctionlookupEventScore($eventType,$default_value){returncollect(['PushEvent'=>5,'CreateEvent'=>4,'IssueEvent'=>3,'IssueCommentEvent'=>2])->get($甚至tType,$default_value);//如果不存在,则默认等于1}}var_dump(GithubScore::score($events));格式数据要求:将以下数据格式化成一个新的结构$messages=['现在应该可以工作了对于所有提供者。','如果您看到标题中有空格,请告诉我。','但是配置或.env文件的密钥中不应该有空白。'];//格式化结果后-应该现在为所有提供者工作。\n-如果您看到标题中有空格,请告诉我。\n-但是config或.env文件的key不能有空白。传统的foreach方式:$comment='-'.array_shift($messages);foreach($messagesas$message){$comment.="\n-${message}";}var_dump($comment);使用集合的地图,内爆方法:$comment=collect($messages)->map(function($message){return'-'.$message;})->implode("\n");var_dump($comment);multiplearrays差需求:两组数据分别代表去年的收入和今年的收入,求月度盈亏。$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];传统的foreach方法:$profit=[];foreach($thisYearas$key=>$monthly){$profit[$key]=$monthly-$lastYear[$key];}var_dump($profit);使用collection的zip,first,last:});zip:将给定数组的值与对应索引处的原始集合的值合并。创建查找数组需求:将以下数组格式化成如下结果:$employees=[['name'=>'example','email'=>'example@exmaple.com','company'=>'exampleInc.'],['name'=>'Lucy','email'=>'lucy@example.com','company'=>'ibmInc.'],['name'=>'Taylor','email'=>'toylor@laravel.com','company'=>'LaravelInc.']];//格式化后的结果$lookup=['example'=>'example@example.com','Lucy'=>'lucy@example.com','Taylor'=>'toylor@laravel.com'];传统的foreach方法:$emails=[];foreach($employeesas$key=>$value){$emails[$value['name']]=$value['email'];}使用集合的reduce方法:$emails=collect($employees)->reduce(函数($emailLookup,$employee){$emailLookup[$employee['name']]=$employee['email'];return$emailLookup;},[]);reduce:将每次迭代的结果传递给下一次,直到集合减少为单个值。使用集合的pluck方法:$emails=collect($employees)->pluck('name','email');参考链接合集在实际开发中使用
