合計
要件: $orders 配列を走査し、価格の合計を見つけます。map: コレクションを走査し、新しいコレクションを返します。1. 従来の foreach メソッドを使用して走査します:<?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'=>[]]], ], ]];ログイン後にコピー2. コレクションのマップ、平坦化、および合計を使用します:$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;ログイン後にコピー
flatten: 多次元配列を 1 次元に変換します。
sum: 配列の合計を返します。
3. flatMap、pluck、およびコレクションの合計を使用します:
$sum = collect($orders)->flatMap(function($order){ return $order['order_products']; })->pluck('price')->sum(); echo $sum;
ログイン後にコピー
map と似ていますが、異なる点は、
flatMap は返された値を直接使用できることです。新しいコレクション。
4. flatMap とコレクションの合計を使用します:
$sum = collect($orders)->flatMap(function($order){ return $order['order_products']; })->sum('price');
ログイン後にコピー
データのフォーマット
要件: 次の構造を持つ配列を以下の新しい配列にフォーマットします。explode: を分割します。 string into an array1. foreach を使用してトラバースします:// 带格式化数组 $gates = [ 'BaiYun_A_A17', 'BeiJing_J7', 'ShuangLiu_K203', 'HongQiao_A157', 'A2', 'BaiYun_B_B230' ]; // 新数组 $boards = [ 'A17', 'J7', 'K203', 'A157', 'A2', 'B230' ];ログイン後にコピー2. コレクションのマップと PHP の展開と末尾を使用します:$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);ログイン後にコピー3. コレクションのマップ、展開、最後、および toArray を使用します:$res = collect($gates)->map(function($gate) { $parts = explode('_', $gate); return end($parts); });ログイン後にコピー$res = collect($gates)->map(function($gate) { return collect(explode('_', $gate))->last(); })->toArray();ログイン後にコピー
last: 最後の要素を取得します
Statistics GitHub Event
まず、このリンクから個人イベントの json を取得します。 1 つのPushEvent は 5 ポイントの価値があり、1 つの
CreateEvent は 4 ポイントの価値があり、1 つの
IssueCommentEvent は 3 ポイントの価値があり、1 つの
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);
ログイン後にコピー
$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; } }
ログイン後にコピー
$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();
ログイン後にコピー
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));
ログイン後にコピー
データのフォーマット
要件:次のデータは新しい構造にフォーマットされます。1. 従来の foreach メソッド:$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.ログイン後にコピー2. セットの map メソッドと implode メソッドを使用する:$comment = '- ' . array_shift($messages); foreach ($messages as $message) { $comment .= "\n - ${message}"; } var_dump($comment);ログイン後にコピー$comment = collect($messages)->map(function($message){ return '- ' . $message; })->implode("\n"); var_dump($comment);ログイン後にコピー
差異を見つけるための複数の配列
要件: 2 つのデータ セットは最後のものを表します今年の収益と今年の収益をそれぞれ、月ごとの損益を求めます。zip: 指定された配列の値を、対応するインデックスにある元のコレクションの値とマージします。1. 従来の foreach メソッド:$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 ];ログイン後にコピー2. コレクションの最初、最後に zip を使用します:$profit = []; foreach($thisYear as $key => $monthly){ $profit[$key] = $monthly - $lastYear[$key]; } var_dump($profit);ログイン後にコピー$profit = collect($thisYear)->zip($lastYear)->map(function($monthly){ return $monthly->first() - $monthly->last(); });ログイン後にコピー
ルックアップ配列の作成
要件: 次の配列を次の結果にフォーマットします:reduce: セットが単一の値に減らされるまで、各反復の結果を次の反復に渡します。1。従来の foreach メソッド:$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。 set:$emails = []; foreach ($employees as $key => $value) { $emails[$value['name']] = $value['email']; }ログイン後にコピー$emails = collect($employees)->reduce(function($emailLookup, $employee){ $emailLookup[$employee['name']] = $employee['email']; return $emailLookup; },[]);ログイン後にコピー
3. 収集に pluck メソッドを使用する:
$emails = collect($employees)->pluck('name', 'email');
ログイン後にコピー