Cette note est utilisée pour organiser les scénarios d'application réels de Collection dans Laravel.
Summing
Exigences : parcourez le tableau $orders et trouvez la somme des prix.
<?php // 引入package require __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. Utilisez la méthode foreach traditionnelle pour parcourir :
$sum = 0; foreach ($orders as $order) { foreach ($order['order_products'] as $item) { $sum += $item['price']; } } echo $sum;2 Utilisez la carte, l'aplatissement et la somme de la collection :
$sum = collect($orders)->map(function($order){ return $order['order_products']; })->flatten(1)->map(function($order){ return $order['price']; })->sum(); echo $sum;
map : parcourez la collection et renvoyez une nouvelle collection.
flatten : convertit un tableau multidimensionnel en une seule dimension.
sum : renvoie la somme du tableau.
$sum = collect($orders)->flatMap(function($order){ return $order['order_products']; })->pluck('price')->sum(); echo $sum;
flatMap : similaire à map
, mais la différence est que flatMap
peut utiliser directement la nouvelle collection renvoyée. . map
类似,不过区别在于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' ];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
4. Utilisez le flatMap et la somme de la collection :
$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);sum : peut recevoir un nom de colonne comme paramètre pour la sommation.
Formatage des données
Exigences : Formatez le tableau avec la structure suivante dans le nouveau tableau ci-dessous.explode : Divisez la chaîne en un tableau.$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; } }1. Utilisez foreach pour parcourir :$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();2 Utilisez la carte de la collection et l'éclatement et la fin de php :$score = $events->pluck('type')->map(function($eventType) { return collect([ 'PushEvent'=> 5, 'CreateEvent'=> 4, 'IssueEvent'=> 3, 'IssueCommentEvent'=> 2 ])->get($eventType, 1); // 如果不存在则默认等于1 })->sum();3 Utilisez la carte, éclater, dernier et toArray de la collection :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));
last : obtenez le dernier élément An
statistiques de l'événement GitHubTout d'abord, obtenez le json de l'événement personnel via ce lien.
Un PushEvent
vaut 5 points, un CreateEvent
vaut 4 points, un IssueCommentEvent
vaut 3 points, un IssueCommentEvent Cela vaut 2 points, les autres types d'événements valent 1 point et le score de temps total de l'utilisateur actuel est calculé. <strong><pre class="brush:php;toolbar:false">$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.</pre>1. Méthode foreach traditionnelle : <pre class="brush:php;toolbar:false">$comment = '- ' . array_shift($messages);
foreach ($messages as $message) {
$comment .= "\n - ${message}";
}
var_dump($comment);</pre>2. Utilisez les méthodes map, pluck et sum de l'ensemble : <pre class="brush:php;toolbar:false">$comment = collect($messages)->map(function($message){
return '- ' . $message;
})->implode("\n");
var_dump($comment);</pre></strong>L'utilisation de la programmation en chaîne de l'ensemble peut bien résoudre les multiples problèmes de traversée ci-dessus.
$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 ];4 Essayez d'encapsuler cette exigence dans une classe :
$profit = []; foreach($thisYear as $key => $monthly){ $profit[$key] = $monthly - $lastYear[$key]; } var_dump($profit);Formater les données