Maison  >  Article  >  cadre php  >  Savez-vous quels sont les scénarios d'utilisation réels de Laravel Collection ?

Savez-vous quels sont les scénarios d'utilisation réels de Laravel Collection ?

藏色散人
藏色散人avant
2021-08-26 15:26:512248parcourir

La colonne tutorielle suivante de Laravel vous présentera les scénarios d'utilisation réels de Laravel Collection. J'espère qu'elle sera utile aux amis dans le besoin !

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__ . &#39;/vendor/autoload.php&#39;;

$orders = [[
    &#39;id&#39;            =>      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.

3. Utilisez le flatMap, le pluck et la somme de la collection :
$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 可以直接使用返回的新集合。

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 分,一个 IssueCommentEvent4. 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.
$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));
explode : Divisez la chaîne en un tableau.

last : obtenez le dernier élément An

statistiques de l'événement GitHub

Tout 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 .= &quot;\n -  ${message}&quot;; } 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)-&gt;map(function($message){     return '- ' . $message; })-&gt;implode(&quot;\n&quot;); 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.

3. Utilisez les méthodes map, pluck et get de la collection :
$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

Exigence : formatez les données suivantes dans une nouvelle structure.
$profit = collect($thisYear)->zip($lastYear)->map(function($monthly){
    return $monthly->first() - $monthly->last();
});
1. Méthode foreach traditionnelle :
$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'
];
2. Utilisez la méthode de cartographie et d'implosion de l'ensemble :
$emails = [];
foreach ($employees as $key => $value) {
    $emails[$value['name']] = $value['email'];
}

Plusieurs tableaux pour trouver la différence

Exigences : Deux ensembles de données représentent respectivement les revenus de l'année dernière et les revenus de cette année. situation de perte. 🎜
$emails = collect($employees)->reduce(function($emailLookup, $employee){
    $emailLookup[$employee['name']] = $employee['email'];
    return $emailLookup;
},[]);
1. Méthode foreach traditionnelle :
$emails = collect($employees)->pluck('name', 'email');
2. Utilisez zip, premier, dernier de la collection : rrreee🎜zip : Fusionnez les valeurs du tableau donné avec les valeurs de la collection d'origine à l'index correspondant. 🎜🎜🎜Créez un tableau de recherche🎜🎜🎜Exigences : Formatez le tableau suivant dans le résultat suivant : 🎜rrreee1 Méthode foreach traditionnelle : rrreee2 Utilisez la méthode de réduction de l'ensemble : rrreee🎜reduce : Transmettez le résultat de chaque itération au. next Répétez jusqu'à ce que l'ensemble soit réduit à une seule valeur. 🎜3. Utilisez la méthode de collecte par pincement : rrreee🎜🎜🎜Recommandations associées : 🎜Les cinq derniers didacticiels vidéo Laravel🎜🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer