Nota ini digunakan untuk mengatur senario aplikasi sebenar Koleksi dalam Laravel.
Jumlah
Keperluan: Rentasi tatasusunan $orders dan cari jumlah harga.
<?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. Gunakan kaedah foreach tradisional untuk melintasi:
$sum = 0; foreach ($orders as $order) { foreach ($order['order_products'] as $item) { $sum += $item['price']; } } echo $sum;2. Gunakan peta, ratakan dan jumlah koleksi:
$sum = collect($orders)->map(function($order){ return $order['order_products']; })->flatten(1)->map(function($order){ return $order['price']; })->sum(); echo $sum;
peta: Rentasi koleksi dan kembalikan koleksi baharu.
ratakan: Tukar tatasusunan berbilang dimensi kepada satu dimensi.
jumlah: Mengembalikan jumlah tatasusunan.
$sum = collect($orders)->flatMap(function($order){ return $order['order_products']; })->pluck('price')->sum(); echo $sum;
flatMap: serupa dengan map
, tetapi perbezaannya ialah flatMap
boleh terus menggunakan koleksi baharu yang dikembalikan.
$sum = collect($orders)->flatMap(function($order){ return $order['order_products']; })->sum('price');
jumlah: Anda boleh menerima nama lajur sebagai parameter untuk penjumlahan.
Data berformat
Keperluan: Format tatasusunan dengan struktur berikut ke dalam tatasusunan baharu di bawah.
// 带格式化数组 $gates = [ 'BaiYun_A_A17', 'BeiJing_J7', 'ShuangLiu_K203', 'HongQiao_A157', 'A2', 'BaiYun_B_B230' ]; // 新数组 $boards = [ 'A17', 'J7', 'K203', 'A157', 'A2', 'B230' ];1. Gunakan foreach untuk melintasi:
$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 Gunakan peta koleksi dan letupan dan penghujung PHP:
$res = collect($gates)->map(function($gate) { $parts = explode('_', $gate); return end($parts); });3 Gunakan peta, letup, terakhir, dan toArray koleksi :
$res = collect($gates)->map(function($gate) { return collect(explode('_', $gate))->last(); })->toArray();
meletup: Pisahkan rentetan kepada tatasusunan
terakhir: Dapatkan elemen terakhir
Peristiwa GitHub Statistik
Pertama, dapatkan peribadi acara json melalui pautan ini.
A PushEvent计
bernilai 5 mata, CreateEvent
bernilai 4 mata, IssueCommentEvent计
bernilai 3 mata, IssueCommentEvent
bernilai 2 mata, jenis acara lain bernilai 1 mata , pengiraan Jumlah markah masa pengguna semasa.
$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);1. Kaedah foreach tradisional:
$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; } }2 Gunakan kaedah peta, cabut dan jumlah set:
$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();
Menggunakan pengaturcaraan rantaian set boleh menyelesaikan perkara di atas beberapa kali dengan baik. Masalah lintasan.
3. Gunakan peta, cabut dan dapatkan kaedah dalam koleksi:$score = $events->pluck('type')->map(function($eventType) { return collect([ 'PushEvent'=> 5, 'CreateEvent'=> 4, 'IssueEvent'=> 3, 'IssueCommentEvent'=> 2 ])->get($eventType, 1); // 如果不存在则默认等于1 })->sum();4 Cuba masukkan keperluan ini ke dalam kelas:
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));
Formatkan data
<.>Keperluan: Formatkan data berikut ke dalam struktur baharu. 1. Kaedah foreach tradisional:$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. Gunakan kaedah pemetaan dan letupan:
$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);
Perbezaan pelbagai tatasusunan
Keperluan : Dua set data mewakili hasil tahun lepas dan hasil tahun ini masing-masing Cari untung dan rugi bulanan. 1. Kaedah foreach tradisional:$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 Gunakan zip, pertama dan terakhir koleksi:
$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(); });zip: Bandingkan nilai tatasusunan yang diberikan dengan nilai asal koleksi pada indeks yang sepadan digabungkan bersama.
Buat tatasusunan carian
Keperluan: Formatkan tatasusunan berikut ke dalam hasil berikut: 1 Kaedah foreach tradisional:$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 kaedah pengurangan koleksi:
$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; },[]);kurangkan: Hantarkan hasil setiap lelaran ke lelaran seterusnya sehingga koleksi dikurangkan kepada satu nilai.
3. Gunakan kaedah kutipan:
$emails = collect($employees)->pluck('name', 'email');