亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

利用Laravel Collections類如何編寫代碼

2020-03-22 18:10:15
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了關于利用Laravel Collections類如何編寫代碼,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

Laravel 提供了一些超贊的組件,在我看來,它是目前所有 Web 框架中提供組件支持最好的一個。它不僅提供了開箱即用的視圖(views)、身份認證(authentication)、會話(sessions)、緩存(caching)、Eloquent、隊列(queues)、數據校驗(data validation)等組件。甚至還提供了開發工具(Valet 和 Homestead)。

但是,這個框架功能中最強大的一個特性常常被萌新們視而不見 - Collection(集合) 類。在這篇文章,我們將探尋如何使用集合提升編碼效率、代碼的易讀行,及編寫出更精簡的編碼。

預覽

最初接觸到使用集合的場景來自于研發人員使用 Eloquent 執行數據庫查詢,并從返回數據中使用 foreach 語句遍歷獲取模型集合。

不過,初學者可能并沒有注意到,集合提供了超過 90 個以上的方法來操作底層數據。更妙的是幾乎所有的方法都支持鏈式操作,能夠讓你的代碼讀起來就像一篇散文一樣。這樣使得你的代碼更易閱讀,無論是你還是其他使用者都是如此。

還沒有進入正題?好吧,讓我們回顧一個簡單的代碼片段,來看看我們如何使用集合編寫粗、快、猛的代碼吧。

代碼示例

讓我們構建一個真實的世界。假設我們查詢某些 API 接口并獲取到如下以數組保存的結果集:

 ?php// API 請求返回的結果$data = [ [ first_name = John , last_name = Doe , age = twenties ], [ first_name = Fred , last_name = Ali , age = thirties ], [ first_name = Alex , last_name = Cho , age = thirties ],];

我們看到數組包含名字(first name)、姓氏(last name) 和年齡(age)范圍?,F在,我們假設從記錄中獲取一名 年齡(age) 為 30 歲(thirties) 的用戶,然后依據 姓氏(last name) 進行 排序(sort)。最后,我們還希望返回的結果為 一個字符串(single string),這樣每個用戶獨占 一行(new line)。最后,我們還希望返回的結果為

這個需求看起來不難實現,現在讓我們看看使用 PHP 如何實現這一功能:

// 依據姓氏排序usort($data, function ($item1, $item2) { return $item1[ last_name ] = $item2[ last_name // 依據年齡范圍分組$new_data = [];foreach ($data as $key = $item) { $new_data[$item[ age ]][$key] = $item;ksort($new_data, SORT_NUMERIC);// 從年齡為 30 歲組里獲取用戶全名$result = array_map(function($item) { return $item[ first_name ]. .$item[ last_name }, $new_data[ thirties // 將數組轉換為字符串并以行分隔符分隔$final = implode( /n , $result);// 譯注:原文是 $final = implode($results, /n implode函數接收兩種順序的參數,為了保持與文檔一致所以我這邊做了調整。

我們的實現代碼超過 20 行,并且很不優雅。移除掉注釋及換行相關代碼,這段代碼會變得難以閱讀。再者,我們還需要借助臨時變量以及 PHP 中內置的不友好的 sort 方法。

現在,讓我們看下借助 Collection 類實現起來是多么簡單吧:

collection($data)- where( age , thirties ) - sortBy( last_name ) - map(function($item){ return $item[ first_name ]. .$item[ last_name  - implode( /n 

哇哦!我們的代碼從 20 行變成了 6 行?,F在的代碼不僅順暢不少,并且在方法實現時無需借助注釋告訴我們它們在處理什么問題。

不過,還存在一個問題阻止我們的代碼不如完美階段... 就是用于比較 first name 和 last name 的 map 方法。坦白說,這真的不是什么大問題,但是它為我們探索 macro(宏) 概念提供了動力。

擴展集合(Extending Collections)

Collection 類,同其它 Laravel 組件一樣,支持宏(macroable),就是說你可以給它添加方法隨后使用。

提示: 如果你希望新方法隨處可用,你應該將它們添加到服務提供中。我喜歡創建一個 MacroServiceProvider 實先這個功能,對于你來說隨你喜歡就好。

讓我們添加一個方法它會連接由數組提供的任意數量的字段并返回字符串結果:

Collection::macro( toConcatenatedString , function ($fields = [], $separator = ) { return $this- map(function($item) use ($fields, $separator) { return implode($separator, array_map(function ($el) use ($item) { return $item[$el]; }, $fields) })- implode( /n });

添加完這個方法后,我們的代碼基本上就完美了:

collect($data)- where( age , thirties ) - sortBy( last_name ) - toConcatenatedString([ first_name , last_name 

我們的代碼從混亂的 20 多行精簡到了 3 行,代碼干凈整潔功能清晰任何人都可以立馬理解。

又一個示例

現在讓我們看下第二個示例,假設我們一個用戶列表,我們需要基于角色(role)過濾出來,然后進一步如果他們的注冊時間為 5 年或以上且 last name 以字母 A-M 開始的僅獲取第一個用戶。

數據類似如下:

 ?php// API 請求返回的結果$users = [ [ name = John Doe , role = vip , years = 7], [ name = Fred Ali , role = vip , years = 3], [ name = Alex Cho , role = user , years = 9],];

如果我們使用的是 PHP 實現,我們的代碼看下來如下:

$subset = [];foreach ($users as $user) { if ($user[ role ] === vip $user[ years ] = 5) { if (preg_match( //s[A-Z]/ , $user[ name ])) { $subset[] = $user;return reset($subset)
注意: 你可以將第二個 if 語句移至第一個里面,但是我個人喜歡在單個 if 語句中使用不超過兩個條件語句,因為我認為超過 2 個條件語句回事代碼難以閱讀。

這段代碼不至于太糟糕,但是我們依然需要使用臨時變量,我們還需要使用 reset 函數將指針重置到第一個用戶。我們的代碼還有四層縮進,這使得代碼解析變得更有挑戰性。

相反,我們來看看集合是如何處理這個問題的:

collect($users)- where( role , vip ) - map(function($user) { return preg_match( //s[A-Z]/ , $user[ name  - firstWhere( years , = , 5 

我們將代碼簡化到了之前的一般左右,每一步過濾處理清晰明了,并且我們不需要引入臨時變量。

遺憾的是目前集合還不支持正則匹配,所以我們使用 map 方法,不過我們可以為這個功能創建一個宏:

Collection::macro( whereRegex , function($expression, $field) { return $this- map(function ($item) use ($expression, $field) { return preg_match($expression, $item[$field]);});

得益于宏方法,我們的代碼現在看起來如下:

collect($users) - where( role , vip ) - whereRegex( //s[A-Z]/ , name ) - firstWhere( years , = , 5);
注意: 為了簡單起見,我們的紅僅僅適用于數組集合。如果你計劃讓它們可以在 Eloquent 集合上使用,你需要在此場景下做相應的代碼處理才行。不同的視角

我們可以繼續列出無數的示例,但仍然無法涵蓋所有可用的集合方法,并且這從來都不是本文的真正目的。

需要注意的是,通過使用 Collection 類,您不僅可以獲得一個方法庫來簡化編程工作,還可以選擇一種從根本上改善代碼的方法。

你會情不自禁的將你的代碼結構從代碼塊重構簡化成一行,同時減少代碼的縮進,臨時變量的使用和技巧性方法,另外你還可以使用鏈式編程方法,這讓你的代碼更加便于閱讀和解析,此外最重要的是減少了編碼工作!

查看官方文檔獲取更多這個迷人的類庫的使用細節:http://laravel.com/docs/coll...

提示: 你還可以獲取這個 Collection 類獨立安裝包,在使用非 laravel 項目是會非常有幫助。感謝 Tighten Co 團隊做出的努力 http://github.com/tightenco/...。

感謝閱讀,快樂編碼!

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !

相關推薦:

關于Laravel的Eloquent ORM的解析

關于Laravel基礎Migrations的解析

以上就是利用Laravel Collections類如何編寫代碼的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品成人av在线| 日韩中文字幕在线播放| 精品视频在线导航| 精品国产电影一区| 欧美视频二区36p| 亚洲人成在线观看| 欧美激情免费在线| 揄拍成人国产精品视频| 亚洲国产欧美一区二区三区久久| 久久精品人人做人人爽| 成人妇女淫片aaaa视频| 91伊人影院在线播放| 2019中文字幕在线免费观看| 成人精品一区二区三区| 久久久免费精品视频| www.久久撸.com| 欧美亚洲国产日本| 国产69精品久久久久9999| 国产精品国产自产拍高清av水多| 色偷偷888欧美精品久久久| 7m第一福利500精品视频| 亚洲第一综合天堂另类专| 青草青草久热精品视频在线网站| 91a在线视频| 97av在线视频免费播放| 精品国产乱码久久久久久虫虫漫画| 欧美精品videossex88| 成人国产精品一区二区| 欧美刺激性大交免费视频| 丰满岳妇乱一区二区三区| 久久精品夜夜夜夜夜久久| 亚洲欧美日韩区| 欧美激情视频在线免费观看 欧美视频免费一| 国产999精品久久久| 日韩中文第一页| 欧美成人激情视频| 精品少妇一区二区30p| 欧美怡红院视频一区二区三区| 国产日韩欧美电影在线观看| 亚洲区中文字幕| 国产精品黄视频| 美日韩精品视频免费看| 欧美激情亚洲国产| 欧美成aaa人片在线观看蜜臀| 国产97人人超碰caoprom| 亚洲最新视频在线| 国产日韩中文在线| 亚洲精品成人久久| 日韩国产精品一区| xxxxx成人.com| 亚洲国产精久久久久久久| 国产欧亚日韩视频| 91精品视频在线免费观看| 国产亚洲欧洲高清一区| 国内精品久久久久影院优| 色噜噜亚洲精品中文字幕| 精品国产成人在线| 夜夜狂射影院欧美极品| 欧美劲爆第一页| 高清一区二区三区日本久| 欧美性猛交丰臀xxxxx网站| 欧美尤物巨大精品爽| 亚洲欧美国产高清va在线播| 伊人伊成久久人综合网小说| 欧美精品手机在线| 欧美理论在线观看| 精品国产91久久久久久老师| 国产精品视频内| 精品久久久久久中文字幕大豆网| 免费不卡欧美自拍视频| 国产97色在线|日韩| 国产精品美乳一区二区免费| 成人a级免费视频| 色噜噜狠狠色综合网图区| 国产一区深夜福利| 91精品国产自产在线老师啪| 中文字幕亚洲一区二区三区| 亚洲精品永久免费精品| 亚洲欧美精品一区二区| 九九热最新视频//这里只有精品| 国产精品美女免费看| 欧美激情一级二级| 美日韩丰满少妇在线观看| 国产精品欧美一区二区三区奶水| 精品一区电影国产| 国产福利视频一区二区| 欧美激情视频在线| 日韩视频免费观看| 亚洲男人第一av网站| 欧美整片在线观看| 国产精品尤物福利片在线观看| 国产成人综合一区二区三区| 久久久久久久一区二区| 日韩av在线一区| 日韩欧美aaa| 国产亚洲成av人片在线观看桃| 精品欧美aⅴ在线网站| 超碰91人人草人人干| 久久久视频在线| 成人中文字幕在线观看| 欧美与欧洲交xxxx免费观看| 少妇精69xxtheporn| 欧美性受xxxx白人性爽| 欧美国产欧美亚洲国产日韩mv天天看完整| 中文字幕国内精品| 欧美华人在线视频| 国产成人精品最新| 91精品一区二区| 午夜精品久久久久久99热| 国产剧情日韩欧美| 亚洲欧美另类中文字幕| 欧美精品第一页在线播放| 亚洲精品美女久久久| 国产美女直播视频一区| 在线播放日韩av| 国产美女精品视频| 国产精品吴梦梦| 成人av电影天堂| 欧美在线视频导航| 欧美激情精品久久久久久大尺度| 国产精品揄拍一区二区| 亚洲www在线| 国产香蕉精品视频一区二区三区| 国产69精品99久久久久久宅男| 成人黄色免费看| 国产精品旅馆在线| 中文亚洲视频在线| 欧美午夜精品久久久久久浪潮| 欧美日韩在线免费| 欧美人在线观看| 久久99久久99精品免观看粉嫩| 国产精品三级网站| 亚洲欧美日韩中文视频| 日韩网站在线观看| 夜夜嗨av色一区二区不卡| 91亚洲国产成人久久精品网站| 最近2019中文字幕一页二页| 97av在线影院| 精品国产乱码久久久久久婷婷| 亚洲午夜av电影| 精品视频在线观看日韩| 九九视频直播综合网| 欧美xxxwww| 亚洲精品久久久久久下一站| 成人在线免费观看视视频| 亚洲色图50p| 欧美超级免费视 在线| 国产在线观看91精品一区| 综合欧美国产视频二区| 欧美裸身视频免费观看| 精品亚洲一区二区三区在线观看| 亚洲香蕉成视频在线观看| 午夜免费日韩视频| 亚洲国产精品电影在线观看| 久久精品国产综合| 久久久久久久久久婷婷| 国产精品日韩电影| 欧美性感美女h网站在线观看免费| 欧美激情乱人伦一区| 欧美激情成人在线视频| 国产精品成人一区| 色妞在线综合亚洲欧美| …久久精品99久久香蕉国产| 亚洲高清一区二|