مجموعه‌های لاراول یا Laravel Collections یکی از قدرتمند‌ترین و بهترین مقررات فریم‌ورک لاراول هستند. در این سری آموزش های لاراول، برخی تکنیکها که میتوانند در هنگام کار با مجموعه های لاراول کاربردی باشند را بررسی خواهیم کرد.

دریافت زیر مجموعه‌ای از داده‌ها

با توجه به آرایه‌ای از داده‌ها، یا یک مجموعه، شاید بخواهید به بخشی از آن دست یابید. این بخش می‌تواند موارد زیر باشد:

  • دو رکورد اول
  • دو رکورد آخر
  • تمام رکوردها، اما در گرو‌ه‌های دو تایی

مجموعه‌ها دارای برخی متدها برای انجام این کارها هستند.

take

متد take یک مقدار integer را می‌گیرد و تعداد مشخص شده را بر می‌گرداند. اگر به آن یک مقدار منفی بدهید نیز،‌ تعداد مشخص شده آیتم‌ها را از آخر مجموعه بر می‌گرداند.

public function takeMe()

    {

        $list = collect([

            'Albert', 'Ben', 'Charles', 'Dan', 'Eric', 'Xavier', 'Yuri', 'Zane'

        ]);

        //دریافت دو نام اول

        $firstTwo = $list->take(2);

        //['Albert', 'Ben']

        //دریافت دو نام آخر

        $lastTwo = $list->take(-2);

        //['Yuri', 'Zane']

    }

chunk

متد chunk، مجموعه مورد نظر را به تکه‌های کوچک‌تر در اندازه «n» تقسیم می‌کند.

  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",],

        ]

        */

    }

وقتی که داده‌ها را به یک blade view منتقل می‌کنید، می‌توانید آن‌ها را به n ردیف در هر بار تقسیم کنید. مثلا به صورتی که هر 3 نام در یک ردیف جا شوند.

@foreach($list->chunk(3) as $names)

    <div class="row">

        @foreach($names as $name)

            {{ $name }}

        @endforeach

    </div>

@endforeach

در نظر داشته باشید که بالعکس می‌توانید chink را انجام دهید، و با استفاده از متد collapse تکه‌های کوچک را به یک مجموعه بزرگتر تبدیل کنید.

تکرار داده‌ها

map

تابع map در یک مجموعه به صورت حلقه‌وار می‌چرخد و هر مقدار را در معرض یک تابع قرار می‌دهد.

ما مجموعه‌ای از نام مردم می‌سازیم و مجموعه‌ای از طول هر نام را بر می‌گردانیم.

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 یک مجموعه جدید می‌سازد، شاید بعضی وقت‌ها بخواهید مجموعه مورد نظر را ویرایش کنید. متد transform یک متد را می‌گیرد و یک action را بر روی همان مجموعه انجام می‌دهد.

از آنجایی که 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 یک مقدار تک را بر می‌گرداند. این متد، نتیجه هر تکرار را به تکرار بعدی منتقل می‌کند.

برای نمونه، برای دریافت مجموعه مقدارهای integer در یک مجموعه، reduce مجموعه اعداد متعاقب را بر می‌گرداند و به صورت حلقه‌وار، نتیجه را به عدد بعدی اضافه می‌کند.

/**

     * دریافت مجموعه اعداد در یک مجموعه

     */

    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 هر آیتم را از طریق یک تابع منتقل می‌کند.

جالب‌ترین بخش درباره متد each این است که به سادگی می‌توانید به برگرداندن مقدار false در تابع، از حلقه خارج شوید.

/**

     * دریافت لیستی از اعداد که معادل یا کوچکتر از5 هستند

     */

    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 مجموعه‌ای جدید می‌سازد، که از هر عنصر nام در یک مجموعه ساخته شده است.

استفاده از یک مجموعه به عنوان یک Set

کلاس Collection همچنین متدهایی برای کمک در کار با داده‌ها به عنوان setها فراهم کرده است. این به این معنی است که می‌توانیم دو دیتاست را مقایسه کنیم و بر پایه آن‌، کارهایی را انجام دهیم.

union

متد 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 عناصر موجود در یک مجموعه که در یک مجموعه یا آرایه منتقل شده وجود ندارند را حذف می‌کند.

public function intersect()
{
        $coolPeople = collect([
            1 => 'John', 2 => 'James', 3 => 'Jack'
        ]);

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

}

دقت کنید که متد intersect کلیدهایی برای مقادیر برگردانده شده را نگه می‌دارد.

امیدوارم این سری آموزش های لاراول برای علاقه مندان مفید و کاربردی باشد.

منبع