成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

教程:Laravel 集合(Collection)的基礎(chǔ)用法

CoderStudy / 3393人閱讀

摘要:方法可以傳一個(gè)單一值,或一組鍵值對(duì)或者一個(gè)回調(diào)函數(shù),然后它會(huì)返回一個(gè)布爾值來告知目標(biāo)內(nèi)容是否在集合中。排序方法接受一個(gè)鍵或回調(diào)函數(shù)參數(shù)用于對(duì)集合進(jìn)行排序。獲取一個(gè)集合中所有數(shù)字的和方法通過回調(diào)函數(shù)傳遞每個(gè)數(shù)據(jù)項(xiàng)。

文章轉(zhuǎn)自:https://learnku.com/laravel/t... 

更多文章:https://learnku.com/laravel/c...

Laravel 集合是 Laravel 框架中一個(gè)十分有用的工具。

Laravel 集合就像是在 PHP 中的數(shù)組,但會(huì)更好用。

在這篇教程中,我們將會(huì)體驗(yàn)一些集合使用時(shí)的實(shí)用技巧。

集合(Collection)

IlluminateSupportCollection?類了提供一個(gè)便捷的操作數(shù)組的封裝。

集合 Collection 類實(shí)現(xiàn)了部分 PHP 和 Laravel 的接口,例如:

ArrayAccess?- 用于操作數(shù)組對(duì)象的接口。

IteratorAggregate?- 用于創(chuàng)建外部迭代器的接口。

JsonSerializable

你可以在這里查看其余已實(shí)現(xiàn)的接口。

創(chuàng)建一個(gè)新的集合

一個(gè)集合可以使用?collect()?幫助函數(shù)基于一個(gè)數(shù)組被創(chuàng)建 或者直接通過?IlluminateSupportCollection?類實(shí)例化。

一個(gè)非常簡單的使用?collect()?幫助函數(shù)的示例:

$newCollection = collect([1, 2, 3, 4, 5]);

一個(gè)更復(fù)雜的示例:


這個(gè)幫助函數(shù)用起來要簡單很多因?yàn)槟阍俨恍枰獙?shí)例化?IlluminateSupportCollection?類。

我也有用到?dd()?幫助函數(shù)來在瀏覽器中顯示集合??雌饋泶蟾艜?huì)是這樣子。

Eloquent ORM 集合

Laravel Eloquent ORM 也以集合的形式返回?cái)?shù)據(jù)。

Eloquent ORM 的調(diào)用會(huì)以集合的形式返回?cái)?shù)據(jù)

為了演示這個(gè)效果,我將初始化一個(gè) Sqlite 數(shù)據(jù)庫。

我們將用 Laravel 框架預(yù)置的遷移文件來創(chuàng)建一個(gè)用戶表,然后填充10條數(shù)據(jù)到用戶表中。

    /**
     * 從用戶表獲取用戶列表
     */
    public function getUsers()
    {
        $users = User::all();
        dd($users);
    }

該控制器方法會(huì)返回一個(gè)如下顯示的所有用戶的 Laravel 集合。

你可以通過箭頭符號(hào)便捷的訪問集合屬性。至于實(shí)例,想要獲取?$users?集合的第一個(gè)用戶的名字,我們可以這樣做。

    /**
     *  獲取第一個(gè)用戶的名字
     */
    public function firstUser()
    {
        $user = User::first();
        dd($user->name);
    }
創(chuàng)建我們的示例集合

我們將會(huì)使用一些最有用的集合操作技巧,你一定會(huì)覺得很好用。

在接下來的幾個(gè)章節(jié)中,我將會(huì)用到下面這套用戶表的數(shù)據(jù)以及一些自定義的集合來達(dá)到演示的目的。雖然我們這里是手動(dòng)創(chuàng)建,但使用 Laravel 的模型工廠來創(chuàng)建也是可以的。

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Chasity Tillman
            [email] => [email protected]
            [age] => 51
            [created_at] => 2016-06-07 15:50:50
            [updated_at] => 2016-06-07 15:50:50
        )
    ...
)
查找數(shù)據(jù)

有多種方法可以在集合中查找數(shù)據(jù)。

contains

contains()?方法可以傳一個(gè)單一值,或一組鍵 / 值對(duì)或者一個(gè)回調(diào)函數(shù),然后它會(huì)返回一個(gè)布爾值來告知目標(biāo)內(nèi)容是否在集合中。

    /**
     * 判斷鍵 / 值對(duì)或回調(diào)內(nèi)容是否存在于集合中
     *
     *
     * @return true or false
     */
    public function contains()
    {
        $users = User::all();
        $users->contains("name", "Chasity Tillman");
        //true

        $collection = collect(["name" => "John", "age" => 23]);
        $collection->contains("Jane");
        //false

        $collection = collect([1, 2, 3, 4, 5]);
        $collection->contains(function ($key, $value) {
            return $value <= 5;
            //true
        });
    }
where

通過鍵值對(duì)的形式, 用 where 方法檢索集合.

where() 方法還可以被鏈?zhǔn)秸{(diào)用。
     /**
     * 使用 where 方法找到匹配的數(shù)據(jù)
     *
     * 通過鏈?zhǔn)秸{(diào)用來增加匹配條件
     */
    public function where()
    {
        $users = User::all();
        $user = $users->where("id", 2);
        // 找出 id 為 2 的用戶

        $user = $users->where("id", 1)
                      ->where("age", "51")
                      ->where("name", "Chasity Tillman");

        // 找出 user 集合中 id 為 1,年齡為 51 歲,名叫 Chasity Tillman 的用戶
    }

還有一些像 where-like 這種用于檢索的方法,我就不一一列舉的,大家可以通過 Laravel 的官方文檔查看。

可以著重看下面幾個(gè):

whereIn()?- 以鍵值對(duì)為參數(shù)檢索集合,其中值必須是組數(shù)。

search()?- 在一個(gè)集合中檢索值,如果有值,返回其索引,如果沒有,則返回?false?。

has()?- 查看鍵值對(duì)是否存,返回布爾值。

過濾數(shù)據(jù)

你可能已經(jīng)猜到了,用?filter() 方法過濾。

你可能也已經(jīng)想到了, filter 方法會(huì)接收一個(gè)回調(diào)函數(shù)作為參數(shù),在回調(diào)函數(shù)中做判斷的邏輯,對(duì)嗎?你是這么想的嗎?

     /**
     * 使用 filter 方法,找出所有年齡小于 35 的用戶
     */
    public function filter()
    {
        $users = User::all();
        $youngsters = $users->filter(function ($value, $key) {
            return $value->age < 35;
        });

        $youngsters->all();
        // 所有年齡小于 35 的用戶
    }

filter 方法會(huì)接收一個(gè)回調(diào)函數(shù)作為參數(shù),回調(diào)函數(shù)的參數(shù)是鍵值對(duì),具體篩選的邏輯寫在函數(shù)里面,并且會(huì)返回所有符合條件的值。

這里還用到了?all()?方法,它會(huì)返回一個(gè)集合里的所有值。

排序 / 排序數(shù)據(jù)

集合允許我們能夠使用兩種簡單的方法對(duì)數(shù)據(jù)進(jìn)行排序 :-

sortBy()?- 給定數(shù)據(jù)進(jìn)行升序排序

sortyByDesc()?- 給定數(shù)據(jù)降序排序

排序方法接受一個(gè)鍵或回調(diào)函數(shù)參數(shù)用于對(duì)集合進(jìn)行排序。

    /**
     * 排序方法接受一個(gè)鍵或回調(diào)函數(shù)參數(shù)
     * 用于對(duì)集合進(jìn)行排序。
     */
    public function sortData()
    {
        $users  = User::all();

        $youngestToOldest = $users->sortBy("age");
        $youngestToOldest->all();
        //列出以年齡升序的所有用戶

        $movies = collect([
            [
                "name" => "Back To The Future",
                "releases" => [1985, 1989, 1990]
            ],
            [
                "name" => "Fast and Furious",
                "releases" => [2001, 2003, 2006, 2009, 2011, 2013, 2015, 2017]
            ],
            [
                "name" => "Speed",
                "releases" => [1994]
            ]
        ]);

        $mostReleases = $movies->sortByDesc(function ($movie, $key) {
            return count($movie["releases"]);
        });

        $mostReleases->toArray();
        //列出以上映總數(shù)降序排序的電影

        dd($mostReleases->values()->toArray());
        /*
           列出以上映總數(shù)降序排序的電影并重置鍵值
        */
    }

排序方法維護(hù)每個(gè)值的鍵。 雖然這對(duì)您的應(yīng)用程序可能很重要,但您可以通過鏈?zhǔn)?values() 方法將它們重置為默認(rèn)的基于零的增量值。

像往常一樣,我還使用一個(gè)將集合轉(zhuǎn)換為數(shù)組的集合方法 toArray() 。

數(shù)據(jù) 分組 groupBy

對(duì)集合進(jìn)行分組有助于理解您的數(shù)據(jù)。 groupBy 方法接受鍵或回調(diào)函數(shù),并根據(jù)鍵值或返回的回調(diào)值返回分組集合。

    /**
     * groupBy 返回基于鍵或回調(diào)函數(shù)分組的數(shù)據(jù)
     * 邏輯
     */
    public function grouping()
    {
        $movies = collect([
            ["name" => "Back To the Future", "genre" => "scifi", "rating" => 8],
            ["name" => "The Matrix",  "genre" => "fantasy", "rating" => 9],
            ["name" => "The Croods",  "genre" => "animation", "rating" => 8],
            ["name" => "Zootopia",  "genre" => "animation", "rating" => 4],
            ["name" => "The Jungle Book",  "genre" => "fantasy", "rating" => 5],
        ]);

        $genre = $movies->groupBy("genre");
        /*
        [
             "scifi" => [
               ["name" => "Back To the Future", "genre" => "scifi", "rating" => 8,],
             ],
             "fantasy" => [
               ["name" => "The Matrix", "genre" => "fantasy", "rating" => 9,],
               ["name" => "The Jungle Book", "genre" => "fantasy", "rating" => 5, ],
             ],
             "animation" => [
               ["name" => "The Croods", "genre" => "animation", "rating" => 8,],
               ["name" => "Zootopia", "genre" => "animation", "rating" => 4, ],
             ],
        ]
        */

        $rating = $movies->groupBy(function ($movie, $key) {
            return $movie["rating"];
        });

        /*
        [
           8 => [
             ["name" => "Back To the Future", "genre" => "scifi", "rating" => 8,],
             ["name" => "The Croods", "genre" => "animation", "rating" => 8,],
           ],
           9 => [
             ["name" => "The Matrix", "genre" => "fantasy", "rating" => 9,],
           ],
           4 => [
             ["name" => "Zootopia","genre" => "animation", "rating" => 4,],
           ],
           5 => [
             ["name" => "The Jungle Book","genre" => "fantasy","rating" => 5,],
           ],
        ]
       */
    }
獲取數(shù)據(jù)子集

給定一組數(shù)據(jù),然后是一個(gè)集合,您可能希望得到它的一部分。 這可能是:

前2條記錄

最后2條記錄

除2組以外的所有記錄。

集合操作幫助我們使用少量的方法完成這些操作。

take

take 方法接受一個(gè)整數(shù)值并返回指定的項(xiàng)數(shù)。給定一個(gè)負(fù)數(shù), take() 返回集合末尾的指定項(xiàng)數(shù)。

    /**
     * take 方法返回集合中的 n 個(gè)項(xiàng)數(shù)。
     * 給定 -n ,返回最后 n 個(gè)項(xiàng)數(shù)
     */
    public function takeMe()
    {
        $list = collect([
            "Albert", "Ben", "Charles", "Dan", "Eric", "Xavier", "Yuri", "Zane"
        ]);

        //獲取前兩個(gè)名字
        $firstTwo = $list->take(2);
        //["Albert", "Ben"]

        //獲取最后兩個(gè)名字
        $lastTwo = $list->take(-2);
        //["Yuri", "Zane"]
    }
chunk

chunk 方法將集合分割成大小為 n 的較小集合。

    /**
     * Chunk(n) 返回大小為 n 的較小集合,每個(gè)都來自原始集合
     * 
     */
    public function chunkMe()
    {
        $list = collect([
            "Albert", "Ben", "Charles", "Dan", "Eric", "Xavier", "Yuri", "Zane"
        ]);

        $chunks = $list->chunk(3);
        $chunks->toArray();
        /*
        [
            ["Albert", "Ben", "Charles",],
            [3 => "Dan", 4 => "Eric", 5 => "Xavier",],
            [6 => "Yuri", 7 => "Zane",],
        ]
        */
    }

這里有很多方法可以達(dá)到效果。

當(dāng)你傳遞數(shù)據(jù)到 blade 頁面時(shí),你可以將他分塊以一次獲得 n 行數(shù)據(jù),例如,將每 3 個(gè)名字裝進(jìn)一行。

@foreach($list->chunk(3) as $names)
    
@foreach($names as $name) {{ $name }} @endforeach
@endforeach

你也可以使用?collapse()?方法將更新的集合組轉(zhuǎn)成一個(gè)大的集合,來反轉(zhuǎn) chunk 方法,請(qǐng)查看此?here.

遍歷數(shù)據(jù) map

map 方法會(huì)遍歷集合,將每個(gè)元素傳入一個(gè)閉包函數(shù),該閉包函數(shù)的返回值將替換原來的元素值。

我們創(chuàng)建一個(gè)由名字組成的集合,并使用 map 方法返回一個(gè)由對(duì)應(yīng)名字長度組成的集合。

   /**
     * map function iterates a collection through a callback
     * function and performs an operation on each value.
     */
    public function mapMe()
    {
        $names = collect([
            "Albert", "Ben", "Charles", "Dan", "Eric", "Xavier", "Yuri", "Zane"
        ]);

        $lengths = $names->map(function ($name, $key) {
            return strlen($name);
        });

        $lengths->toArray();
        //[6, 3, 7, 3, 4, 6, 4, 4,]
    }
transform

雖然 map 方法創(chuàng)建了一個(gè)新的集合,但有時(shí)候你可能想去修改原始的集合內(nèi)容。transform 提供了一個(gè)回調(diào)方法,并對(duì)同一個(gè)集合進(jìn)行操作。

因?yàn)檗D(zhuǎn)換不會(huì)產(chǎn)生新的集合,所以你無需把它賦給新的值。

    /**
     * Transform 操作原始的集合。
     */
    public function transformMe()
    {
        $names = collect([
            "Albert", "Ben", "Charles", "Dan", "Eric", "Xavier", "Yuri", "Zane"
        ]);

        $names->transform(function ($name, $key) {
            return strlen($name);
        });

        $names->toArray();
        //[6, 3, 7, 3, 4, 6, 4, 4,]
    }
reduce

不同于 map 和 transform 方法,reduce 方法返回單個(gè)值。他將每次迭代的結(jié)果傳給下一次迭代。

例如,為了獲取一個(gè)集合中所有整數(shù)的和,reduce 會(huì)傳遞后續(xù)數(shù)字的總和,并迭代的將結(jié)果添加到下一個(gè)數(shù)字。

    /**
     * 獲取一個(gè)集合中所有數(shù)字的和
     */
    public function reduceMe()
    {
        $numbers = collect([
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10
        ]);

        $sum = $numbers->reduce(function ($sum, $number) {
            return $sum + $number;
        });
        //55
    }
each

each 方法通過回調(diào)函數(shù)傳遞每個(gè)數(shù)據(jù)項(xiàng)。

關(guān)于 each 方法最有趣的部分是,你可以簡單的在回調(diào)函數(shù)中返回 false 來跳出循環(huán)。

    /**
     *打印小于等于五的一列數(shù)字
     *
     */
    public function eachMethod()
    {
        $numbers = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
        $smallNumbers = $numbers->each(function ($num, $key) {
            if ($num > 5) {
                return false;
            }
            echo $num .", ";
        });
        //1, 2, 3, 4, 5,
    }
every
every 方法創(chuàng)建一個(gè)由集合中每第 n 個(gè)元素組成的新集合。
集合論

Laravel 提供了對(duì)集合論的支持,這意味著我們可以對(duì)兩個(gè)不同集合取交集、并集等操作。

union

union?方法將給定的數(shù)組添加到集合。如果給定的數(shù)組含有與原集合一樣的鍵,則原集合的值不會(huì)被改變:

    /**
     * add array values to a collection using union
     */
    public function union()
    {
        $coolPeople = collect([
            1 => "John", 2 => "James", 3 => "Jack"
        ]);

        $allCoolPeople = $coolPeople->union([
            4 => "Sarah", 1 => "Susan", 5 =>"Seyi"
        ]);
        $allCoolPeople->all();
        /*
        [
            1 => "John", 2 => "James", 3 => "Jack", 4 => "Sarah", 5 => "Seyi",
       ]
       */
    }
intersect

intersect() 方法接收一個(gè)數(shù)組或集合作為參數(shù),該方法會(huì)將集合中那些不包含在傳入?yún)?shù)的元素移除。

    /**
     * Return a list of very cool people in collection that
     * are in the given array
     */
    public function intersect()
    {
        $coolPeople = collect([
            1 => "John", 2 => "James", 3 => "Jack"
        ]);

        $veryCoolPeople = $coolPeople->intersect(["Sarah", "John", "James"]);
        $veryCoolPeople->toArray();
        //[1 => "John" 2 => "James"]
    }

可以發(fā)現(xiàn), intersect 方法的返回值保留了原有的鍵。

結(jié)論

我試圖涵蓋你可能找到你能自己找到所需的集合方法,但這仍然有太多需要學(xué)的。

最值得注意的,我留下以下內(nèi)容

常見的數(shù)學(xué)方法,例如?sum?和?avg。

涉及更新集合的方法,例如?splice,prepend,push?和?pop。

在?Laravel 文檔?和 ?Laravel API 文檔 上還有你可以用于操作集合的更多方法,貨心你想查看一下。

要跟進(jìn)本教程代碼,查看 gtihub 倉庫?here。隨意貢獻(xiàn)你的代碼。

文章轉(zhuǎn)自:https://learnku.com/laravel/t... 

更多文章:https://learnku.com/laravel/c...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31136.html

相關(guān)文章

  • 十五個(gè)常用 Laravel 集合Collection

    摘要:將返回通過回調(diào)真值測(cè)試的第一個(gè)項(xiàng)的鍵。方法將集合分割為多個(gè)給定大小的較小集合。它可用于在任何位置的調(diào)試和查找集合內(nèi)的內(nèi)容。方法用于遍歷整個(gè)集合。這對(duì)集合同樣有效。它將導(dǎo)致由第二個(gè)參數(shù)的值作為鍵的集合。它接受回調(diào)并傳遞并將集合傳遞給它。 showImg(https://segmentfault.com/img/remote/1460000018924972); 文章轉(zhuǎn)自:https://...

    alphahans 評(píng)論0 收藏0
  • Laravel tap 用法

    摘要:中也可以在類中使用方法。這里有一個(gè)例子,用于網(wǎng)站支持英語和法語。取代月份的語言翻譯文件,使用列出一年每個(gè)月份的。使用處理控制臺(tái)命令進(jìn)度條這是在集合中最典型的用例。 本文參照轉(zhuǎn)譯: http://derekmd.com/2017/02/la... https://murze.be/2017/02/lara... Laravel 5.3 中增加了一個(gè)新的全局幫助函數(shù) tap(),改進(jìn)了框架...

    el09xccxy 評(píng)論0 收藏0
  • laravel中g(shù)et()與 first()區(qū)別、collection與stdClass區(qū)別

    摘要:本文來自原文鏈接歡迎作客我們的學(xué)習(xí)群最簡單的,里得到的是一組數(shù)據(jù),得到的是一個(gè)數(shù)據(jù)。 本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050 最簡單的,laravel里get()得到的是一組數(shù)據(jù),first()得到的是一個(gè)model數(shù)據(jù)。 從形式上,laravel里每一個(gè)model數(shù)據(jù)(record),在取出的時(shí)候都是用的PH...

    kycool 評(píng)論0 收藏0
  • laravel手動(dòng)創(chuàng)建數(shù)組分頁

    摘要:目前,無法高效執(zhí)行使用語句的分頁操作。如果你需要在分頁結(jié)果集中使用,建議你查詢數(shù)據(jù)庫并手動(dòng)創(chuàng)建分頁器。手動(dòng)創(chuàng)建分頁如果你想手動(dòng)創(chuàng)建分頁實(shí)例并且最終得到一個(gè)數(shù)組類型的結(jié)果,可以根據(jù)需求來創(chuàng)建或者實(shí)例來實(shí)現(xiàn)。 showImg(https://segmentfault.com/img/bVbbGos?w=640&h=400); laravel分頁功能: 有幾種方法可以對(duì)數(shù)據(jù)進(jìn)行分頁。最簡單的...

    acrazing 評(píng)論0 收藏0
  • 你可能需要了解下Laravel集合

    摘要:前言集合通過進(jìn)行實(shí)例,的內(nèi)核大部分的參數(shù)傳遞都用到了集合,但這并不代表集合就是好的。當(dāng)你需要處理一組數(shù)組時(shí),你可能就需要它幫助你快捷的解決實(shí)際問題。例如我們需要通過一個(gè)水平線切分?jǐn)?shù)組,將其分為個(gè)及以上的數(shù)組個(gè)數(shù)。謝謝,還不抓緊去練習(xí)下集合 showImg(https://segmentfault.com/img/bVbhjvY?w=600&h=296); 前言 集合通過 Illumin...

    fuyi501 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<