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'=>[]]], ], ]];
$sum = 0; foreach ($orders as $order) { foreach ($order['order_products'] as $item) { $sum += $item['price']; } } echo $sum;
$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' ];
$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);
$res = collect($gates)->map(function($gate) { $parts = explode('_', $gate); return end($parts); });
$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);
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.1. Utilisez foreach pour parcourir :$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; } }Copier après la connexion2 Utilisez la carte de la collection et l'éclatement et la fin de php :$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();Copier après la connexion3 Utilisez la carte, éclater, dernier et toArray de la collection :$score = $events->pluck('type')->map(function($eventType) { return collect([ 'PushEvent'=> 5, 'CreateEvent'=> 4, 'IssueEvent'=> 3, 'IssueCommentEvent'=> 2 ])->get($eventType, 1); // 如果不存在则默认等于1 })->sum();Copier après la connexionclass 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));Copier après la connexion
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><div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">Copier après la connexion</div></div>1. Méthode foreach traditionnelle : <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$comment = '- ' . array_shift($messages);
foreach ($messages as $message) {
$comment .= "\n - ${message}";
}
var_dump($comment);</pre><div class="contentsignin">Copier après la connexion</div></div>2. Utilisez les méthodes map, pluck et sum de l'ensemble : <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">$comment = collect($messages)->map(function($message){
return '- ' . $message;
})->implode("\n");
var_dump($comment);</pre><div class="contentsignin">Copier après la connexion</div></div></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 ];
$profit = []; foreach($thisYear as $key => $monthly){ $profit[$key] = $monthly - $lastYear[$key]; } var_dump($profit);