نسخه:

مجموعه ها

معرفی

این Illuminate\Support\Collection کلاس یک پوشش روان و راحت برای کار با آرایه های داده ارائه می دهد. برای مثال کد زیر را بررسی کنید. ما از collect کمک کننده برای ایجاد یک نمونه مجموعه جدید از آرایه استفاده می کنیم، strtoupper تابع را روی هر عنصر اجرا می کنیم و سپس همه عناصر خالی را حذف می کنیم:

$collection = collect(['taylor', 'abigail', null])->map(function ($name) {
return strtoupper($name);
})
->reject(function ($name) {
return empty($name);
});

همانطور که می بینید، Collection کلاس به شما اجازه می دهد تا متدهای خود را برای انجام نگاشت روان و کاهش آرایه زیرین زنجیره بزنید. به طور کلی، مجموعه ها تغییر ناپذیر هستند، به این معنی که هر Collection روش یک نمونه کاملاً جدید را برمی گرداند Collection .

ایجاد مجموعه ها

همانطور که در بالا ذکر شد، collect کمک کننده یک نمونه جدید Illuminate\Support\Collection برای آرایه داده شده برمی گرداند. بنابراین، ایجاد یک مجموعه به همین سادگی است:

$collection = collect([1, 2, 3]);

نتایج جستجوهای Eloquent همیشه به عنوان Collection نمونه برگردانده می شوند.

گسترش مجموعه ها

مجموعه ها "macroable" هستند، که به شما امکان می دهد روش های اضافی را Collection در زمان اجرا به کلاس اضافه کنید. به عنوان مثال، کد زیر یک toUpper متد را به Collection کلاس اضافه می کند:

use Illuminate\Support\Collection;
use Illuminate\Support\Str;
 
Collection::macro('toUpper', function () {
return $this->map(function ($value) {
return Str::upper($value);
});
});
 
$collection = collect(['first', 'second']);
 
$upper = $collection->toUpper();
 
// ['FIRST', 'SECOND']

به طور معمول، شما باید ماکروهای مجموعه را در یک ارائه دهنده خدمات اعلام کنید .

روش های موجود

برای بقیه این مستندات، در مورد هر روش موجود در Collection کلاس بحث خواهیم کرد. به یاد داشته باشید، همه این روش ها ممکن است برای دستکاری روان آرایه زیرین زنجیره شوند. علاوه بر این، تقریباً هر روش یک Collection نمونه جدید را برمی گرداند و به شما امکان می دهد در صورت لزوم نسخه اصلی مجموعه را حفظ کنید:

همه میانگین میانگین تکه سقوط - فروپاشی جمع آوری کنید ترکیب کردن concat شامل شامل Strict شمردن شمارش توسط crossJoin DD تفاوت diffAssoc کلیدهای diff زباله تکراری duplicatesStrict هر یک هر گسترش هر بجز فیلتر اولین اول کجا فلت مپ صاف کردن تلنگر فراموش کردن برای صفحه گرفتن دسته بندی بر اساس دارد منفجر شدن تقاطع intersectByKeys خالی است isNotEmpty است پیوستن کلید توسط کلیدها آخر کلان ساختن نقشه نقشه به mapSpread mapToGroups mapWithKeys حداکثر میانه ادغام mergeRecursive دقیقه حالت نهمین فقط پد تقسیم بندی لوله چیدن ترکیدن پیش انداختن کشیدن فشار دادن قرار دادن تصادفی كاهش دادن رد کردن جایگزین کردن جایگزین بازگشتی معکوس جستجو کردن تغییر مکان بر زدن جست و خیز کردن skipUntil skipWhile تکه مقداری مرتب سازی مرتب سازی بر اساس sortByDesc sortDesc کلیدهای مرتب سازی sortKeysDesc اتصال شکاف مجموع گرفتن بگیر تا takeWhile ضربه زدن بار به آرایه به جیسون تبدیل اتحاد. اتصال منحصر بفرد منحصربفردStrict مگر اینکه مگر اینکه خالی باشد مگر اینکه خالی نباشد باز کردن ارزش های چه زمانی وقتی خالی WhenNotEmpty جایی که کجا سخت جایی که بین که در آن WhereInStrict WhereInstanceOf WhereNotBetween WhereNotIn WhereNotInStrict WhereNotNull WhereNull بسته بندی کردن زیپ

فهرست روش

all()

متد all آرایه زیربنایی نشان داده شده توسط مجموعه را برمی گرداند:

collect([1, 2, 3])->all();
 
// [1, 2, 3]

average()

نام مستعار برای avg روش.

avg()

متد مقدار متوسط ​​یک کلید داده شده را avg برمی گرداند :

$average = collect([['foo' => 10], ['foo' => 10], ['foo' => 20], ['foo' => 40]])->avg('foo');
 
// 20
 
$average = collect([1, 1, 2, 4])->avg();
 
// 2

chunk()

این chunk روش مجموعه را به چند مجموعه کوچکتر با اندازه معین تقسیم می کند:

$collection = collect([1, 2, 3, 4, 5, 6, 7]);
 
$chunks = $collection->chunk(4);
 
$chunks->toArray();
 
// [[1, 2, 3, 4], [5, 6, 7]]

این روش به ویژه در نماها هنگام کار با یک سیستم شبکه مانند Bootstrap مفید است . تصور کنید مجموعه ای از مدل های Eloquent دارید که می خواهید در یک شبکه نمایش دهید:

@foreach ($products->chunk(3) as $chunk)
<div class="row">
@foreach ($chunk as $product)
<div class="col-xs-4">{{ $product->name }}</div>
@endforeach
</div>
@endforeach

collapse()

این collapse روش مجموعه ای از آرایه ها را به یک مجموعه واحد و مسطح جمع می کند:

$collection = collect([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
 
$collapsed = $collection->collapse();
 
$collapsed->all();
 
// [1, 2, 3, 4, 5, 6, 7, 8, 9]

combine()

این combine روش مقادیر مجموعه را به عنوان کلید با مقادیر آرایه یا مجموعه دیگری ترکیب می کند:

$collection = collect(['name', 'age']);
 
$combined = $collection->combine(['George', 29]);
 
$combined->all();
 
// ['name' => 'George', 'age' => 29]

collect()

این collect روش یک نمونه جدید را Collection با مواردی که در حال حاضر در مجموعه هستند برمی گرداند:

$collectionA = collect([1, 2, 3]);
 
$collectionB = $collectionA->collect();
 
$collectionB->all();
 
// [1, 2, 3]

این collect روش در درجه اول برای تبدیل مجموعه های تنبل به نمونه های استاندارد مفید است Collection :

$lazyCollection = LazyCollection::make(function () {
yield 1;
yield 2;
yield 3;
});
 
$collection = $lazyCollection->collect();
 
get_class($collection);
 
// 'Illuminate\Support\Collection'
 
$collection->all();
 
// [1, 2, 3]

این collect روش مخصوصاً زمانی مفید است که شما یک نمونه از Enumerable مجموعه غیر تنبل دارید و نیاز دارید. از آنجایی که collect() بخشی از Enumerable قرارداد است، می توانید با خیال راحت از آن برای دریافت Collection نمونه استفاده کنید.

concat()

این concat روش مقادیر داده شده array یا مجموعه را به انتهای مجموعه اضافه می کند:

$collection = collect(['John Doe']);
 
$concatenated = $collection->concat(['Jane Doe'])->concat(['name' => 'Johnny Doe']);
 
$concatenated->all();
 
// ['John Doe', 'Jane Doe', 'Johnny Doe']

contains()

این contains روش تعیین می کند که آیا مجموعه شامل یک آیتم معین است یا خیر:

$collection = collect(['name' => 'Desk', 'price' => 100]);
 
$collection->contains('Desk');
 
// true
 
$collection->contains('New York');
 
// false

همچنین می‌توانید یک جفت کلید/مقدار را به contains متد ارسال کنید، که تعیین می‌کند آیا جفت داده شده در مجموعه وجود دارد یا خیر:

$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
]);
 
$collection->contains('product', 'Bookcase');
 
// false

در نهایت، می‌توانید contains برای انجام تست حقیقت خود، یک فراخوان به روش ارسال کنید:

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

این contains روش هنگام بررسی مقادیر آیتم از مقایسه‌های "لست" استفاده می‌کند، به این معنی که رشته‌ای با مقدار صحیح برابر با یک عدد صحیح با همان مقدار در نظر گرفته می‌شود. از روشی برای فیلتر کردن با استفاده از مقایسه های "سخت" استفاده کنید containsStrict .

containsStrict()

این روش دارای امضای مشابه contains روش است. با این حال، تمام مقادیر با استفاده از مقایسه "سخت" مقایسه می شوند.

رفتار این روش هنگام استفاده از Eloquent Collections اصلاح می شود .

count()

این count روش تعداد کل آیتم های مجموعه را برمی گرداند:

$collection = collect([1, 2, 3, 4]);
 
$collection->count();
 
// 4

countBy()

این countBy روش تعداد مقادیر در مجموعه را شمارش می کند. به‌طور پیش‌فرض، این متد وقوع هر عنصر را شمارش می‌کند:

$collection = collect([1, 2, 2, 2, 3]);
 
$counted = $collection->countBy();
 
$counted->all();
 
// [1 => 1, 2 => 3, 3 => 1]

با این حال، شما یک callback به countBy روش ارسال می کنید تا همه موارد را با یک مقدار سفارشی شمارش کنید:

$collection = collect(['alice@gmail.com', 'bob@yahoo.com', 'carlos@gmail.com']);
 
$counted = $collection->countBy(function ($email) {
return substr(strrchr($email, "@"), 1);
});
 
$counted->all();
 
// ['gmail.com' => 2, 'yahoo.com' => 1]

crossJoin()

متد crossJoin متقاطع مقادیر مجموعه را در میان آرایه ها یا مجموعه های داده شده می پیوندد و یک محصول دکارتی را با همه جایگشت های ممکن برمی گرداند:

$collection = collect([1, 2]);
 
$matrix = $collection->crossJoin(['a', 'b']);
 
$matrix->all();
 
/*
[
[1, 'a'],
[1, 'b'],
[2, 'a'],
[2, 'b'],
]
*/
 
$collection = collect([1, 2]);
 
$matrix = $collection->crossJoin(['a', 'b'], ['I', 'II']);
 
$matrix->all();
 
/*
[
[1, 'a', 'I'],
[1, 'a', 'II'],
[1, 'b', 'I'],
[1, 'b', 'II'],
[2, 'a', 'I'],
[2, 'a', 'II'],
[2, 'b', 'I'],
[2, 'b', 'II'],
]
*/

dd()

این dd روش آیتم های مجموعه را تخلیه می کند و اجرای اسکریپت را پایان می دهد:

$collection = collect(['John Doe', 'Jane Doe']);
 
$collection->dd();
 
/*
Collection {
#items: array:2 [
0 => "John Doe"
1 => "Jane Doe"
]
}
*/

اگر نمی خواهید اجرای اسکریپت را متوقف کنید، dump به جای آن از روش استفاده کنید.

diff()

این diff روش مجموعه را با یک مجموعه دیگر یا یک PHP ساده array بر اساس مقادیر آن مقایسه می کند. این متد مقادیر موجود در مجموعه اصلی را که در مجموعه داده شده وجود ندارد برمی گرداند:

$collection = collect([1, 2, 3, 4, 5]);
 
$diff = $collection->diff([2, 4, 6, 8]);
 
$diff->all();
 
// [1, 3, 5]

رفتار این روش هنگام استفاده از Eloquent Collections اصلاح می شود .

diffAssoc()

این diffAssoc روش مجموعه را با یک مجموعه دیگر یا یک PHP ساده array بر اساس کلیدها و مقادیر آن مقایسه می کند. این روش جفت‌های کلید/مقدار را در مجموعه اصلی که در مجموعه داده‌شده وجود ندارد، برمی‌گرداند:

$collection = collect([
'color' => 'orange',
'type' => 'fruit',
'remain' => 6,
]);
 
$diff = $collection->diffAssoc([
'color' => 'yellow',
'type' => 'fruit',
'remain' => 3,
'used' => 6,
]);
 
$diff->all();
 
// ['color' => 'orange', 'remain' => 6]

diffKeys()

این diffKeys روش مجموعه را با یک مجموعه دیگر یا یک PHP ساده array بر اساس کلیدهای آن مقایسه می کند. این روش جفت‌های کلید/مقدار را در مجموعه اصلی که در مجموعه داده‌شده وجود ندارد، برمی‌گرداند:

$collection = collect([
'one' => 10,
'two' => 20,
'three' => 30,
'four' => 40,
'five' => 50,
]);
 
$diff = $collection->diffKeys([
'two' => 2,
'four' => 4,
'six' => 6,
'eight' => 8,
]);
 
$diff->all();
 
// ['one' => 10, 'three' => 30, 'five' => 50]

dump()

این dump روش آیتم های مجموعه را تخلیه می کند:

$collection = collect(['John Doe', 'Jane Doe']);
 
$collection->dump();
 
/*
Collection {
#items: array:2 [
0 => "John Doe"
1 => "Jane Doe"
]
}
*/

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

duplicates()

متد duplicates مقادیر تکراری را از مجموعه بازیابی و برمی گرداند:

$collection = collect(['a', 'b', 'a', 'c', 'b']);
 
$collection->duplicates();
 
// [2 => 'a', 4 => 'b']

اگر مجموعه حاوی آرایه ها یا اشیاء باشد، می توانید کلید ویژگی هایی را که می خواهید برای مقادیر تکراری بررسی کنید، ارسال کنید:

$employees = collect([
['email' => 'abigail@example.com', 'position' => 'Developer'],
['email' => 'james@example.com', 'position' => 'Designer'],
['email' => 'victoria@example.com', 'position' => 'Developer'],
])
 
$employees->duplicates('position');
 
// [2 => 'Developer']

duplicatesStrict()

این روش دارای امضای مشابه duplicates روش است. با این حال، تمام مقادیر با استفاده از مقایسه "سخت" مقایسه می شوند.

each()

متد each روی آیتم های مجموعه تکرار می شود و هر آیتم را به یک فراخوان ارسال می کند:

$collection->each(function ($item, $key) {
//
});

اگر می‌خواهید تکرار موارد را متوقف کنید، می‌توانید false از پاسخ به تماس خود بازگردید:

$collection->each(function ($item, $key) {
if (/* some condition */) {
return false;
}
});

eachSpread()

روش eachSpread بر روی آیتم های مجموعه تکرار می شود و هر مقدار مورد تودرتو را به فراخوانی داده شده ارسال می کند:

$collection = collect([['John Doe', 35], ['Jane Doe', 33]]);
 
$collection->eachSpread(function ($name, $age) {
//
});

می‌توانید با بازگشت از پاسخ به تماس، تکرار را از طریق موارد متوقف کنید false :

$collection->eachSpread(function ($name, $age) {
return false;
});

every()

این every روش ممکن است برای تأیید اینکه همه عناصر یک مجموعه از آزمون صدق معین عبور می کنند استفاده شود:

collect([1, 2, 3, 4])->every(function ($value, $key) {
return $value > 2;
});
 
// false

اگر مجموعه خالی باشد، every true برمی گردد:

$collection = collect([]);
 
$collection->every(function ($value, $key) {
return $value > 2;
});
 
// true

except()

متد except تمام موارد موجود در مجموعه را به جز مواردی که دارای کلیدهای مشخص شده هستند برمی گرداند:

$collection = collect(['product_id' => 1, 'price' => 100, 'discount' => false]);
 
$filtered = $collection->except(['price', 'discount']);
 
$filtered->all();
 
// ['product_id' => 1]

برای معکوس except ، تنها روش را ببینید.

رفتار این روش هنگام استفاده از Eloquent Collections اصلاح می شود .

filter()

این filter روش مجموعه را با استفاده از فراخوانی داده شده فیلتر می کند و فقط مواردی را نگه می دارد که از آزمون صدق معین عبور می کنند:

$collection = collect([1, 2, 3, 4]);
 
$filtered = $collection->filter(function ($value, $key) {
return $value > 2;
});
 
$filtered->all();
 
// [3, 4]

اگر هیچ تماسی ارائه نشود، تمام ورودی‌های مجموعه که معادل هستند false حذف خواهند شد:

$collection = collect([1, 2, 3, null, false, '', 0, []]);
 
$collection->filter()->all();
 
// [1, 2, 3]

برای معکوس filter ، روش رد را ببینید .

first()

این first متد اولین عنصری را در مجموعه برمی‌گرداند که آزمون صدق داده شده را با موفقیت پشت سر می‌گذارد:

collect([1, 2, 3, 4])->first(function ($value, $key) {
return $value > 2;
});
 
// 3

همچنین می توانید first متد را بدون آرگومان فراخوانی کنید تا اولین عنصر مجموعه را بدست آورید. اگر مجموعه خالی باشد، null برگردانده می شود:

collect([1, 2, 3, 4])->first();
 
// 1

firstWhere()

متد firstWhere اولین عنصر مجموعه را با جفت کلید / مقدار داده شده برمی گرداند:

$collection = collect([
['name' => 'Regena', 'age' => null],
['name' => 'Linda', 'age' => 14],
['name' => 'Diego', 'age' => 23],
['name' => 'Linda', 'age' => 84],
]);
 
$collection->firstWhere('name', 'Linda');
 
// ['name' => 'Linda', 'age' => 14]

همچنین می توانید این firstWhere متد را با یک اپراتور فراخوانی کنید:

$collection->firstWhere('age', '>=', 18);
 
// ['name' => 'Diego', 'age' => 23]

مانند متد Where ، می‌توانید یک آرگومان را به firstWhere متد ارسال کنید. در این سناریو، firstWhere متد اولین مورد را برمی‌گرداند که در آن مقدار کلید مورد داده‌شده «درست» است:

$collection->firstWhere('age');
 
// ['name' => 'Linda', 'age' => 14]

flatMap()

متد flatMap از طریق مجموعه تکرار می شود و هر مقدار را به callback داده شده ارسال می کند. بازخوانی برای اصلاح آیتم و بازگرداندن آن آزاد است، بنابراین مجموعه جدیدی از آیتم های اصلاح شده تشکیل می شود. سپس، آرایه با یک سطح صاف می شود:

$collection = collect([
['name' => 'Sally'],
['school' => 'Arkansas'],
['age' => 28]
]);
 
$flattened = $collection->flatMap(function ($values) {
return array_map('strtoupper', $values);
});
 
$flattened->all();
 
// ['name' => 'SALLY', 'school' => 'ARKANSAS', 'age' => '28'];

flatten()

این flatten روش یک مجموعه چند بعدی را به یک بعد منفرد صاف می کند:

$collection = collect(['name' => 'taylor', 'languages' => ['php', 'javascript']]);
 
$flattened = $collection->flatten();
 
$flattened->all();
 
// ['taylor', 'php', 'javascript'];

شما می توانید به صورت اختیاری تابع را آرگومان "depth" ارسال کنید:

$collection = collect([
'Apple' => [
['name' => 'iPhone 6S', 'brand' => 'Apple'],
],
'Samsung' => [
['name' => 'Galaxy S7', 'brand' => 'Samsung'],
],
]);
 
$products = $collection->flatten(1);
 
$products->values()->all();
 
/*
[
['name' => 'iPhone 6S', 'brand' => 'Apple'],
['name' => 'Galaxy S7', 'brand' => 'Samsung'],
]
*/

در این مثال، فراخوانی flatten بدون ارائه عمق، آرایه‌های تودرتو را نیز مسطح می‌کرد و منجر به ['iPhone 6S', 'Apple', 'Galaxy S7', 'Samsung'] . ارائه عمق به شما امکان می دهد سطوح آرایه های تو در تو را که مسطح می شوند محدود کنید.

flip()

این flip روش کلیدهای مجموعه را با مقادیر متناظر آنها مبادله می کند:

$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
 
$flipped = $collection->flip();
 
$flipped->all();
 
// ['taylor' => 'name', 'laravel' => 'framework']

forget()

این forget روش یک آیتم را با کلید خود از مجموعه حذف می کند:

$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
 
$collection->forget('name');
 
$collection->all();
 
// ['framework' => 'laravel']

برخلاف اکثر روش‌های جمع‌آوری دیگر، forget مجموعه اصلاح‌شده جدیدی را برمی‌گرداند. مجموعه ای را که فراخوانی می شود اصلاح می کند.

forPage()

این forPage روش یک مجموعه جدید حاوی مواردی را که در یک شماره صفحه مشخص وجود دارد، برمی گرداند. متد شماره صفحه را به عنوان اولین آرگومان خود و تعداد مواردی که در هر صفحه نشان می دهد به عنوان آرگومان دوم خود می پذیرد:

$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]);
 
$chunk = $collection->forPage(2, 3);
 
$chunk->all();
 
// [4, 5, 6]

get()

متد get مورد را در یک کلید مشخص برمی گرداند. اگر کلید وجود نداشته باشد، null برگردانده می شود:

$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
 
$value = $collection->get('name');
 
// taylor

می توانید به صورت اختیاری یک مقدار پیش فرض را به عنوان آرگومان دوم ارسال کنید:

$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
 
$value = $collection->get('foo', 'default-value');
 
// default-value

حتی ممکن است یک callback را به عنوان مقدار پیش فرض ارسال کنید. اگر کلید مشخص شده وجود نداشته باشد، نتیجه تماس برگشتی برگردانده خواهد شد:

$collection->get('email', function () {
return 'default-value';
});
 
// default-value

groupBy()

این groupBy روش اقلام مجموعه را با یک کلید مشخص گروه بندی می کند:

$collection = collect([
['account_id' => 'account-x10', 'product' => 'Chair'],
['account_id' => 'account-x10', 'product' => 'Bookcase'],
['account_id' => 'account-x11', 'product' => 'Desk'],
]);
 
$grouped = $collection->groupBy('account_id');
 
$grouped->toArray();
 
/*
[
'account-x10' => [
['account_id' => 'account-x10', 'product' => 'Chair'],
['account_id' => 'account-x10', 'product' => 'Bookcase'],
],
'account-x11' => [
['account_id' => 'account-x11', 'product' => 'Desk'],
],
]
*/

به جای ارسال یک رشته key ، ممکن است یک تماس برگشتی ارسال کنید. تماس برگشتی باید مقداری را که می‌خواهید گروه را کلید بزنید، برگرداند:

$grouped = $collection->groupBy(function ($item, $key) {
return substr($item['account_id'], -3);
});
 
$grouped->toArray();
 
/*
[
'x10' => [
['account_id' => 'account-x10', 'product' => 'Chair'],
['account_id' => 'account-x10', 'product' => 'Bookcase'],
],
'x11' => [
['account_id' => 'account-x11', 'product' => 'Desk'],
],
]
*/

معیارهای گروه بندی چندگانه ممکن است به عنوان یک آرایه ارسال شوند. هر عنصر آرایه به سطح مربوطه در یک آرایه چند بعدی اعمال می شود:

$data = new Collection([
10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],
20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],
30 => ['user' => 3, 'skill' => 2, 'roles' => ['Role_1']],
40 => ['user' => 4, 'skill' => 2, 'roles' => ['Role_2']],
]);
 
$result = $data->groupBy([
'skill',
function ($item) {
return $item['roles'];
},
], $preserveKeys = true);
 
/*
[
1 => [
'Role_1' => [
10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],
20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],
],
'Role_2' => [
20 => ['user' => 2, 'skill' => 1, 'roles' => ['Role_1', 'Role_2']],
],
'Role_3' => [
10 => ['user' => 1, 'skill' => 1, 'roles' => ['Role_1', 'Role_3']],
],
],
2 => [
'Role_1' => [
30 => ['user' => 3, 'skill' => 2, 'roles' => ['Role_1']],
],
'Role_2' => [
40 => ['user' => 4, 'skill' => 2, 'roles' => ['Role_2']],
],
],
];
*/

has()

این has روش تعیین می کند که آیا یک کلید داده شده در مجموعه وجود دارد یا خیر:

$collection = collect(['account_id' => 1, 'product' => 'Desk', 'amount' => 5]);
 
$collection->has('product');
 
// true
 
$collection->has(['product', 'amount']);
 
// true
 
$collection->has(['amount', 'price']);
 
// false

implode()

این implode روش موارد را در یک مجموعه به هم می پیوندد. آرگومان های آن به نوع آیتم های مجموعه بستگی دارد. اگر مجموعه حاوی آرایه ها یا اشیاء است، باید کلید ویژگی هایی را که می خواهید به آنها بپیوندید، و رشته "چسب" را که می خواهید بین مقادیر قرار دهید ارسال کنید:

$collection = collect([
['account_id' => 1, 'product' => 'Desk'],
['account_id' => 2, 'product' => 'Chair'],
]);
 
$collection->implode('product', ', ');
 
// Desk, Chair

اگر مجموعه شامل رشته‌های ساده یا مقادیر عددی است، "چسب" را به عنوان تنها آرگومان به متد ارسال کنید:

collect([1, 2, 3, 4, 5])->implode('-');
 
// '1-2-3-4-5'

intersect()

این intersect روش هر مقداری را از مجموعه اصلی که در مجموعه داده شده array یا مجموعه وجود ندارد حذف می کند. مجموعه به دست آمده کلیدهای مجموعه اصلی را حفظ می کند:

$collection = collect(['Desk', 'Sofa', 'Chair']);
 
$intersect = $collection->intersect(['Desk', 'Chair', 'Bookcase']);
 
$intersect->all();
 
// [0 => 'Desk', 2 => 'Chair']

رفتار این روش هنگام استفاده از Eloquent Collections اصلاح می شود .

intersectByKeys()

این intersectByKeys روش کلیدهایی را از مجموعه اصلی که در مجموعه داده شده array یا مجموعه وجود ندارد حذف می کند:

$collection = collect([
'serial' => 'UX301', 'type' => 'screen', 'year' => 2009,
]);
 
$intersect = $collection->intersectByKeys([
'reference' => 'UX404', 'type' => 'tab', 'year' => 2011,
]);
 
$intersect->all();
 
// ['type' => 'screen', 'year' => 2009]

isEmpty()

اگر مجموعه خالی باشد متد isEmpty برمی گردد . true در غیر این صورت false بازگردانده می شود:

collect([])->isEmpty();
 
// true

isNotEmpty()

اگر مجموعه خالی نباشد، متد isNotEmpty برمی گردد . true در غیر این صورت false بازگردانده می شود:

collect([])->isNotEmpty();
 
// false

join()

این join متد مقادیر مجموعه را با یک رشته به هم می پیوندد:

collect(['a', 'b', 'c'])->join(', '); // 'a, b, c'
collect(['a', 'b', 'c'])->join(', ', ', and '); // 'a, b, and c'
collect(['a', 'b'])->join(', ', ' and '); // 'a and b'
collect(['a'])->join(', ', ' and '); // 'a'
collect([])->join(', ', ' and '); // ''

keyBy()

متد keyBy مجموعه را با کلید داده شده کلید می زند. اگر چندین مورد یک کلید داشته باشند، فقط آخرین مورد در مجموعه جدید ظاهر می شود:

$collection = collect([
['product_id' => 'prod-100', 'name' => 'Desk'],
['product_id' => 'prod-200', 'name' => 'Chair'],
]);
 
$keyed = $collection->keyBy('product_id');
 
$keyed->all();
 
/*
[
'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
]
*/

همچنین می توانید یک تماس برگشتی به روش ارسال کنید. تماس برگشتی باید مقداری را برای کلید زدن مجموعه به صورت زیر برگرداند:

$keyed = $collection->keyBy(function ($item) {
return strtoupper($item['product_id']);
});
 
$keyed->all();
 
/*
[
'PROD-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
'PROD-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
]
*/

keys()

متد keys تمام کلیدهای مجموعه را برمی گرداند:

$collection = collect([
'prod-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
'prod-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
]);
 
$keys = $collection->keys();
 
$keys->all();
 
// ['prod-100', 'prod-200']

last()

این last متد آخرین عنصر مجموعه را که از آزمون صدق داده شده عبور می کند، برمی گرداند:

collect([1, 2, 3, 4])->last(function ($value, $key) {
return $value < 3;
});
 
// 2

همچنین می توانید last متد را بدون آرگومان فراخوانی کنید تا آخرین عنصر مجموعه را بدست آورید. اگر مجموعه خالی باشد، null برگردانده می شود:

collect([1, 2, 3, 4])->last();
 
// 4

macro()

متد static به شما امکان می دهد در زمان اجرا macro متدهایی را به کلاس اضافه کنید . برای اطلاعات بیشتر Collection به اسناد گسترش مجموعه ها مراجعه کنید.

make()

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

map()

متد map از طریق مجموعه تکرار می شود و هر مقدار را به callback داده شده ارسال می کند. پاسخ به تماس برای اصلاح مورد و بازگرداندن آن آزاد است، بنابراین مجموعه جدیدی از موارد اصلاح شده تشکیل می شود:

$collection = collect([1, 2, 3, 4, 5]);
 
$multiplied = $collection->map(function ($item, $key) {
return $item * 2;
});
 
$multiplied->all();
 
// [2, 4, 6, 8, 10]

مانند بسیاری از روش های جمع آوری دیگر، map یک نمونه مجموعه جدید را برمی گرداند. مجموعه ای را که فراخوانی می شود تغییر نمی دهد. اگر می خواهید مجموعه اصلی را تغییر دهید، از transform روش استفاده کنید.

mapInto()

متد mapInto() روی مجموعه تکرار می شود و با ارسال مقدار به سازنده یک نمونه جدید از کلاس داده شده ایجاد می کند:

class Currency
{
/**
* Create a new currency instance.
*
* @param string $code
* @return void
*/
function __construct(string $code)
{
$this->code = $code;
}
}
 
$collection = collect(['USD', 'EUR', 'GBP']);
 
$currencies = $collection->mapInto(Currency::class);
 
$currencies->all();
 
// [Currency('USD'), Currency('EUR'), Currency('GBP')]

mapSpread()

این mapSpread روش روی آیتم‌های مجموعه تکرار می‌شود و هر مقدار مورد تودرتو را به فراخوانی داده شده ارسال می‌کند. پاسخ به تماس برای اصلاح مورد و بازگرداندن آن آزاد است، بنابراین مجموعه جدیدی از موارد اصلاح شده تشکیل می شود:

$collection = collect([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
 
$chunks = $collection->chunk(2);
 
$sequence = $chunks->mapSpread(function ($even, $odd) {
return $even + $odd;
});
 
$sequence->all();
 
// [1, 5, 9, 13, 17]

mapToGroups()

این mapToGroups روش اقلام مجموعه را بر اساس تماس داده شده گروه بندی می کند. فراخوانی باید یک آرایه انجمنی حاوی یک جفت کلید / مقدار را برگرداند، بنابراین مجموعه جدیدی از مقادیر گروه بندی شده را تشکیل می دهد:

$collection = collect([
[
'name' => 'John Doe',
'department' => 'Sales',
],
[
'name' => 'Jane Doe',
'department' => 'Sales',
],
[
'name' => 'Johnny Doe',
'department' => 'Marketing',
]
]);
 
$grouped = $collection->mapToGroups(function ($item, $key) {
return [$item['department'] => $item['name']];
});
 
$grouped->toArray();
 
/*
[
'Sales' => ['John Doe', 'Jane Doe'],
'Marketing' => ['Johnny Doe'],
]
*/
 
$grouped->get('Sales')->all();
 
// ['John Doe', 'Jane Doe']

mapWithKeys()

متد mapWithKeys از طریق مجموعه تکرار می شود و هر مقدار را به callback داده شده ارسال می کند. تماس برگشتی باید یک آرایه انجمنی حاوی یک جفت کلید / مقدار را برگرداند:

$collection = collect([
[
'name' => 'John',
'department' => 'Sales',
'email' => 'john@example.com',
],
[
'name' => 'Jane',
'department' => 'Marketing',
'email' => 'jane@example.com',
]
]);
 
$keyed = $collection->mapWithKeys(function ($item) {
return [$item['email'] => $item['name']];
});
 
$keyed->all();
 
/*
[
'john@example.com' => 'John',
'jane@example.com' => 'Jane',
]
*/

max()

متد max حداکثر مقدار یک کلید داده شده را برمی گرداند:

$max = collect([['foo' => 10], ['foo' => 20]])->max('foo');
 
// 20
 
$max = collect([1, 2, 3, 4, 5])->max();
 
// 5

median()

متد مقدار میانه یک کلید داده شده را median برمی گرداند :

$median = collect([['foo' => 10], ['foo' => 10], ['foo' => 20], ['foo' => 40]])->median('foo');
 
// 15
 
$median = collect([1, 1, 2, 4])->median();
 
// 1.5

merge()

متد merge آرایه یا مجموعه داده شده را با مجموعه اصلی ادغام می کند. اگر یک کلید رشته ای در آیتم های داده شده با کلید رشته ای در مجموعه اصلی مطابقت داشته باشد، مقدار آیتم های داده شده، مقدار موجود در مجموعه اصلی را بازنویسی می کند:

$collection = collect(['product_id' => 1, 'price' => 100]);
 
$merged = $collection->merge(['price' => 200, 'discount' => false]);
 
$merged->all();
 
// ['product_id' => 1, 'price' => 200, 'discount' => false]

اگر کلیدهای موارد داده شده عددی باشند، مقادیر به انتهای مجموعه اضافه می شوند:

$collection = collect(['Desk', 'Chair']);
 
$merged = $collection->merge(['Bookcase', 'Door']);
 
$merged->all();
 
// ['Desk', 'Chair', 'Bookcase', 'Door']

mergeRecursive()

این mergeRecursive روش آرایه یا مجموعه داده شده را به صورت بازگشتی با مجموعه اصلی ادغام می کند. اگر یک کلید رشته ای در آیتم های داده شده با کلید رشته ای در مجموعه اصلی مطابقت داشته باشد، آنگاه مقادیر این کلیدها با هم در یک آرایه ادغام می شوند و این به صورت بازگشتی انجام می شود:

$collection = collect(['product_id' => 1, 'price' => 100]);
 
$merged = $collection->mergeRecursive(['product_id' => 2, 'price' => 200, 'discount' => false]);
 
$merged->all();
 
// ['product_id' => [1, 2], 'price' => [100, 200], 'discount' => false]

min()

متد min حداقل مقدار یک کلید داده شده را برمی گرداند:

$min = collect([['foo' => 10], ['foo' => 20]])->min('foo');
 
// 10
 
$min = collect([1, 2, 3, 4, 5])->min();
 
// 1

mode()

متد مقدار حالت یک کلید داده شده را mode برمی گرداند :

$mode = collect([['foo' => 10], ['foo' => 10], ['foo' => 20], ['foo' => 40]])->mode('foo');
 
// [10]
 
$mode = collect([1, 1, 2, 4])->mode();
 
// [1]

nth()

این nth روش یک مجموعه جدید متشکل از هر n-امین عنصر ایجاد می کند:

$collection = collect(['a', 'b', 'c', 'd', 'e', 'f']);
 
$collection->nth(4);
 
// ['a', 'e']

شما می توانید به صورت اختیاری یک offset را به عنوان آرگومان دوم ارسال کنید:

$collection->nth(4, 1);
 
// ['b', 'f']

only()

متد only موارد موجود در مجموعه را با کلیدهای مشخص شده برمی گرداند:

$collection = collect(['product_id' => 1, 'name' => 'Desk', 'price' => 100, 'discount' => false]);
 
$filtered = $collection->only(['product_id', 'name']);
 
$filtered->all();
 
// ['product_id' => 1, 'name' => 'Desk']

برای معکوس only ، به روش استثنا مراجعه کنید .

رفتار این روش هنگام استفاده از Eloquent Collections اصلاح می شود .

pad()

این pad روش آرایه را با مقدار داده شده پر می کند تا زمانی که آرایه به اندازه مشخص شده برسد. این روش مانند تابع array_pad PHP عمل می کند.

برای پد به سمت چپ، باید اندازه منفی را مشخص کنید. اگر قدر مطلق اندازه داده شده کمتر یا مساوی طول آرایه باشد، هیچ بالشتکی انجام نخواهد شد:

$collection = collect(['A', 'B', 'C']);
 
$filtered = $collection->pad(5, 0);
 
$filtered->all();
 
// ['A', 'B', 'C', 0, 0]
 
$filtered = $collection->pad(-5, 0);
 
$filtered->all();
 
// [0, 0, 'A', 'B', 'C']

partition()

این partition روش ممکن است با تابع PHP ترکیب شود list تا عناصری را که تست صدق داده شده را از آنهایی که قبول نمی کنند، جدا کند:

$collection = collect([1, 2, 3, 4, 5, 6]);
 
list($underThree, $equalOrAboveThree) = $collection->partition(function ($i) {
return $i < 3;
});
 
$underThree->all();
 
// [1, 2]
 
$equalOrAboveThree->all();
 
// [3, 4, 5, 6]

pipe()

متد pipe مجموعه را به callback داده شده ارسال می کند و نتیجه را برمی گرداند:

$collection = collect([1, 2, 3]);
 
$piped = $collection->pipe(function ($collection) {
return $collection->sum();
});
 
// 6

pluck()

متد pluck تمام مقادیر یک کلید داده شده را بازیابی می کند:

$collection = collect([
['product_id' => 'prod-100', 'name' => 'Desk'],
['product_id' => 'prod-200', 'name' => 'Chair'],
]);
 
$plucked = $collection->pluck('name');
 
$plucked->all();
 
// ['Desk', 'Chair']

همچنین می‌توانید تعیین کنید که چگونه می‌خواهید مجموعه به دست آمده کلید شود:

$plucked = $collection->pluck('name', 'product_id');
 
$plucked->all();
 
// ['prod-100' => 'Desk', 'prod-200' => 'Chair']

این pluck روش همچنین از بازیابی مقادیر تو در تو با استفاده از نماد "نقطه" پشتیبانی می کند:

$collection = collect([
[
'speakers' => [
'first_day' => ['Rosa', 'Judith'],
'second_day' => ['Angela', 'Kathleen'],
],
],
]);
 
$plucked = $collection->pluck('speakers.first_day');
 
$plucked->all();
 
// ['Rosa', 'Judith']

اگر کلیدهای تکراری وجود داشته باشد، آخرین عنصر منطبق در مجموعه برداشته شده درج می شود:

$collection = collect([
['brand' => 'Tesla', 'color' => 'red'],
['brand' => 'Pagani', 'color' => 'white'],
['brand' => 'Tesla', 'color' => 'black'],
['brand' => 'Pagani', 'color' => 'orange'],
]);
 
$plucked = $collection->pluck('color', 'brand');
 
$plucked->all();
 
// ['Tesla' => 'black', 'Pagani' => 'orange']

pop()

متد pop آخرین مورد را از مجموعه حذف و برمی گرداند:

$collection = collect([1, 2, 3, 4, 5]);
 
$collection->pop();
 
// 5
 
$collection->all();
 
// [1, 2, 3, 4]

prepend()

این prepend روش یک آیتم را به ابتدای مجموعه اضافه می کند:

$collection = collect([1, 2, 3, 4, 5]);
 
$collection->prepend(0);
 
$collection->all();
 
// [0, 1, 2, 3, 4, 5]

همچنین می توانید یک آرگومان دوم را برای تنظیم کلید آیتم از پیش تعیین شده ارسال کنید:

$collection = collect(['one' => 1, 'two' => 2]);
 
$collection->prepend(0, 'zero');
 
$collection->all();
 
// ['zero' => 0, 'one' => 1, 'two' => 2]

pull()

متد pull یک آیتم را با کلید خود از مجموعه حذف و برمی گرداند:

$collection = collect(['product_id' => 'prod-100', 'name' => 'Desk']);
 
$collection->pull('name');
 
// 'Desk'
 
$collection->all();
 
// ['product_id' => 'prod-100']

push()

این push روش یک مورد را به انتهای مجموعه اضافه می کند:

$collection = collect([1, 2, 3, 4]);
 
$collection->push(5);
 
$collection->all();
 
// [1, 2, 3, 4, 5]

put()

متد put کلید و مقدار داده شده را در مجموعه تنظیم می کند:

$collection = collect(['product_id' => 1, 'name' => 'Desk']);
 
$collection->put('price', 100);
 
$collection->all();
 
// ['product_id' => 1, 'name' => 'Desk', 'price' => 100]

random()

متد random یک آیتم تصادفی را از مجموعه برمی گرداند:

$collection = collect([1, 2, 3, 4, 5]);
 
$collection->random();
 
// 4 - (retrieved randomly)

شما می توانید به صورت اختیاری یک عدد صحیح به آن ارسال کنید random تا مشخص کنید که چه تعداد آیتم را می خواهید به طور تصادفی بازیابی کنید. مجموعه ای از اقلام همیشه هنگام ارسال صریح تعداد مواردی که می خواهید دریافت کنید بازگردانده می شود:

$random = $collection->random(3);
 
$random->all();
 
// [2, 4, 5] - (retrieved randomly)

اگر مجموعه موارد کمتر از درخواستی داشته باشد، متد یک عدد را پرتاب می کند InvalidArgumentException .

reduce()

این reduce روش مجموعه را به یک مقدار کاهش می دهد و نتیجه هر تکرار را به تکرار بعدی منتقل می کند:

$collection = collect([1, 2, 3]);
 
$total = $collection->reduce(function ($carry, $item) {
return $carry + $item;
});
 
// 6

مقدار برای $carry در اولین تکرار null ; با این حال، می توانید مقدار اولیه آن را با ارسال آرگومان دوم به reduce :

$collection->reduce(function ($carry, $item) {
return $carry + $item;
}, 4);
 
// 10

reject()

این reject روش مجموعه را با استفاده از پاسخ تماس داده شده فیلتر می کند. true اگر مورد باید از مجموعه حاصل حذف شود، تماس برگشتی باید برگردد :

$collection = collect([1, 2, 3, 4]);
 
$filtered = $collection->reject(function ($value, $key) {
return $value > 2;
});
 
$filtered->all();
 
// [1, 2]

برای معکوس روش reject ، روش را ببینید filter .

replace()

روش replace شبیه به merge ; با این حال، این روش علاوه بر بازنویسی موارد منطبق با کلیدهای رشته ای، replace مواردی را در مجموعه که دارای کلیدهای عددی منطبق هستند نیز بازنویسی می کند:

$collection = collect(['Taylor', 'Abigail', 'James']);
 
$replaced = $collection->replace([1 => 'Victoria', 3 => 'Finn']);
 
$replaced->all();
 
// ['Taylor', 'Victoria', 'James', 'Finn']

replaceRecursive()

این روش مانند کار می کند replace ، اما در آرایه ها تکرار می شود و همان فرآیند جایگزینی را برای مقادیر داخلی اعمال می کند:

$collection = collect(['Taylor', 'Abigail', ['James', 'Victoria', 'Finn']]);
 
$replaced = $collection->replaceRecursive(['Charlie', 2 => [1 => 'King']]);
 
$replaced->all();
 
// ['Charlie', 'Abigail', ['James', 'King', 'Finn']]

reverse()

این reverse روش ترتیب اقلام مجموعه را معکوس می کند و کلیدهای اصلی را حفظ می کند:

$collection = collect(['a', 'b', 'c', 'd', 'e']);
 
$reversed = $collection->reverse();
 
$reversed->all();
 
/*
[
4 => 'e',
3 => 'd',
2 => 'c',
1 => 'b',
0 => 'a',
]
*/

متد search مجموعه را برای مقدار داده شده جستجو می کند و در صورت یافتن کلید آن را برمی گرداند. اگر مورد پیدا نشد، false برگردانده می شود.

$collection = collect([2, 4, 6, 8]);
 
$collection->search(4);
 
// 1

جستجو با استفاده از یک مقایسه "شل" انجام می شود، به این معنی که یک رشته با یک مقدار صحیح برابر با یک عدد صحیح با همان مقدار در نظر گرفته می شود. برای استفاده از مقایسه دقیق، true به عنوان آرگومان دوم به متد ارسال کنید:

$collection->search('4', true);
 
// false

از طرف دیگر، می‌توانید برای جستجوی اولین موردی که آزمون صدق شما را با موفقیت پشت سر می‌گذارد، پاسخ تماس خود را انجام دهید:

$collection->search(function ($item, $key) {
return $item > 5;
});
 
// 2

shift()

متد shift اولین مورد را از مجموعه حذف و برمی گرداند:

$collection = collect([1, 2, 3, 4, 5]);
 
$collection->shift();
 
// 1
 
$collection->all();
 
// [2, 3, 4, 5]

shuffle()

این shuffle روش به طور تصادفی موارد موجود در مجموعه را با هم مخلوط می کند:

$collection = collect([1, 2, 3, 4, 5]);
 
$shuffled = $collection->shuffle();
 
$shuffled->all();
 
// [3, 2, 5, 1, 4] - (generated randomly)

skip()

این skip روش مجموعه جدیدی را بدون اولین مقدار داده شده از آیتم ها برمی گرداند:

$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
 
$collection = $collection->skip(4);
 
$collection->all();
 
// [5, 6, 7, 8, 9, 10]

skipUntil()

این skipUntil روش از آیتم ها می گذرد تا زمانی که تماس داده شده برگردد true و سپس موارد باقی مانده در مجموعه را برمی گرداند:

$collection = collect([1, 2, 3, 4]);
 
$subset = $collection->skipUntil(function ($item) {
return $item >= 3;
});
 
$subset->all();
 
// [3, 4]

همچنین می‌توانید یک مقدار ساده به skipUntil متد ارسال کنید تا از همه موارد پرش کنید تا مقدار داده شده پیدا شود:

$collection = collect([1, 2, 3, 4]);
 
$subset = $collection->skipUntil(3);
 
$subset->all();
 
// [3, 4]

اگر مقدار داده شده یافت نشد یا تماس برگشتی هرگز برنگردد true ، skipUntil متد یک مجموعه خالی برمی گرداند.

skipWhile()

این skipWhile روش از آیتم ها پرش می کند در حالی که تماس داده شده برمی گردد true و سپس موارد باقی مانده در مجموعه را برمی گرداند:

$collection = collect([1, 2, 3, 4]);
 
$subset = $collection->skipWhile(function ($item) {
return $item <= 3;
});
 
$subset->all();
 
// [4]

اگر پاسخ تماس هرگز برنگردد true ، skipWhile متد یک مجموعه خالی را برمی گرداند.

slice()

این slice روش برشی از مجموعه را برمی‌گرداند که از شاخص داده شده شروع می‌شود:

$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
 
$slice = $collection->slice(4);
 
$slice->all();
 
// [5, 6, 7, 8, 9, 10]

اگر می خواهید اندازه برش برگشتی را محدود کنید، اندازه مورد نظر را به عنوان آرگومان دوم به متد ارسال کنید:

$slice = $collection->slice(4, 2);
 
$slice->all();
 
// [5, 6]

برش برگشتی کلیدها را به طور پیش فرض حفظ می کند. اگر نمی خواهید کلیدهای اصلی را حفظ کنید، می توانید از values روش برای فهرست مجدد آنها استفاده کنید.

some()

نام مستعار برای contains روش.

sort()

روش sort مجموعه را مرتب می کند. مجموعه مرتب شده کلیدهای آرایه اصلی را نگه می دارد، بنابراین در این مثال از values روش بازنشانی کلیدها به فهرست های شماره گذاری شده متوالی استفاده می کنیم:

$collection = collect([5, 3, 1, 2, 4]);
 
$sorted = $collection->sort();
 
$sorted->values()->all();
 
// [1, 2, 3, 4, 5]

اگر نیازهای مرتب‌سازی شما پیشرفته‌تر است، می‌توانید sort با الگوریتم خود یک تماس برگشتی را ارسال کنید. به مستندات PHP در مورد مراجعه کنید uasort ، که sort روش مجموعه آن را در زیر هود می نامد.

اگر می‌خواهید مجموعه‌ای از آرایه‌ها یا اشیاء تودرتو را مرتب کنید، به sortBy و sortByDesc متدها مراجعه کنید.

sortBy()

متد sortBy مجموعه را بر اساس کلید داده شده مرتب می کند. مجموعه مرتب شده کلیدهای آرایه اصلی را نگه می دارد، بنابراین در این مثال از values روش بازنشانی کلیدها به فهرست های شماره گذاری شده متوالی استفاده می کنیم:

$collection = collect([
['name' => 'Desk', 'price' => 200],
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
]);
 
$sorted = $collection->sortBy('price');
 
$sorted->values()->all();
 
/*
[
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
['name' => 'Desk', 'price' => 200],
]
*/

همچنین می توانید برای تعیین نحوه مرتب سازی مقادیر مجموعه، پاسخ تماس خود را ارسال کنید:

$collection = collect([
['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
['name' => 'Chair', 'colors' => ['Black']],
['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
]);
 
$sorted = $collection->sortBy(function ($product, $key) {
return count($product['colors']);
});
 
$sorted->values()->all();
 
/*
[
['name' => 'Chair', 'colors' => ['Black']],
['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
]
*/

sortByDesc()

این متد دارای امضای مشابه متد است sortBy ، اما مجموعه را به ترتیب مخالف مرتب می کند.

sortDesc()

این روش مجموعه را به ترتیب مخالف به عنوان sort روش مرتب می کند:

$collection = collect([5, 3, 1, 2, 4]);
 
$sorted = $collection->sortDesc();
 
$sorted->values()->all();
 
// [5, 4, 3, 2, 1]

بر خلاف sort , شما ممکن است پاسخ تماس را به sortDesc . اگر مایل به استفاده از تماس برگشتی هستید، باید از sort مقایسه خود استفاده کرده و معکوس کنید.

sortKeys()

این sortKeys روش مجموعه را بر اساس کلیدهای آرایه انجمنی زیرین مرتب می کند:

$collection = collect([
'id' => 22345,
'first' => 'John',
'last' => 'Doe',
]);
 
$sorted = $collection->sortKeys();
 
$sorted->all();
 
/*
[
'first' => 'John',
'id' => 22345,
'last' => 'Doe',
]
*/

sortKeysDesc()

این متد دارای امضای مشابه متد است sortKeys ، اما مجموعه را به ترتیب مخالف مرتب می کند.

splice()

این splice متد تکه‌ای از آیتم‌ها را حذف می‌کند و برمی‌گرداند که با ایندکس مشخص شده شروع می‌شوند:

$collection = collect([1, 2, 3, 4, 5]);
 
$chunk = $collection->splice(2);
 
$chunk->all();
 
// [3, 4, 5]
 
$collection->all();
 
// [1, 2]

شما می توانید یک آرگومان دوم را برای محدود کردن اندازه قطعه به دست آمده ارسال کنید:

$collection = collect([1, 2, 3, 4, 5]);
 
$chunk = $collection->splice(2, 1);
 
$chunk->all();
 
// [3]
 
$collection->all();
 
// [1, 2, 4, 5]

علاوه بر این، می توانید یک آرگومان سوم حاوی آیتم های جدید را برای جایگزینی موارد حذف شده از مجموعه ارسال کنید:

$collection = collect([1, 2, 3, 4, 5]);
 
$chunk = $collection->splice(2, 1, [10, 11]);
 
$chunk->all();
 
// [3]
 
$collection->all();
 
// [1, 2, 10, 11, 4, 5]

split()

این split روش یک مجموعه را به تعداد معین گروه تقسیم می کند:

$collection = collect([1, 2, 3, 4, 5]);
 
$groups = $collection->split(3);
 
$groups->toArray();
 
// [[1, 2], [3, 4], [5]]

sum()

متد sum مجموع همه موارد موجود در مجموعه را برمی گرداند:

collect([1, 2, 3, 4, 5])->sum();
 
// 15

اگر مجموعه شامل آرایه‌ها یا اشیاء تو در تو است، باید کلیدی را برای تعیین مقادیر جمع‌آوری کنید:

$collection = collect([
['name' => 'JavaScript: The Good Parts', 'pages' => 176],
['name' => 'JavaScript: The Definitive Guide', 'pages' => 1096],
]);
 
$collection->sum('pages');
 
// 1272

علاوه بر این، می‌توانید پاسخ تماس خود را ارسال کنید تا تعیین کنید کدام مقادیر مجموعه را جمع کنید:

$collection = collect([
['name' => 'Chair', 'colors' => ['Black']],
['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
]);
 
$collection->sum(function ($product) {
return count($product['colors']);
});
 
// 6

take()

متد take یک مجموعه جدید با تعداد مشخص شده از آیتم ها را برمی گرداند:

$collection = collect([0, 1, 2, 3, 4, 5]);
 
$chunk = $collection->take(3);
 
$chunk->all();
 
// [0, 1, 2]

همچنین می توانید یک عدد صحیح منفی برای برداشتن مقدار مشخصی از موارد از انتهای مجموعه ارسال کنید:

$collection = collect([0, 1, 2, 3, 4, 5]);
 
$chunk = $collection->take(-2);
 
$chunk->all();
 
// [4, 5]

takeUntil()

متد takeUntil موارد را در مجموعه برمی‌گرداند تا زمانی که فراخوان داده شده بازگردد true :

$collection = collect([1, 2, 3, 4]);
 
$subset = $collection->takeUntil(function ($item) {
return $item >= 3;
});
 
$subset->all();
 
// [1, 2]

همچنین می‌توانید یک مقدار ساده به takeUntil متد ارسال کنید تا آیتم‌ها را تا زمانی که مقدار داده شده پیدا شود، بدست آورید:

$collection = collect([1, 2, 3, 4]);
 
$subset = $collection->takeUntil(3);
 
$subset->all();
 
// [1, 2]

اگر مقدار داده شده یافت نشد یا تماس برگشتی هرگز برنگردد true ، takeUntil متد همه موارد موجود در مجموعه را برمی گرداند.

takeWhile()

متد takeWhile موارد را در مجموعه برمی‌گرداند تا زمانی که فراخوان داده شده بازگردد false :

$collection = collect([1, 2, 3, 4]);
 
$subset = $collection->takeWhile(function ($item) {
return $item < 3;
});
 
$subset->all();
 
// [1, 2]

اگر پاسخ تماس هرگز برنگردد false ، takeWhile متد همه موارد موجود در مجموعه را برمی گرداند.

tap()

این tap روش مجموعه را به تماس داده شده ارسال می کند، و به شما امکان می دهد در یک نقطه خاص به مجموعه ضربه بزنید و کاری با موارد انجام دهید در حالی که بر خود مجموعه تأثیر نمی گذارد:

collect([2, 4, 3, 1, 5])
->sort()
->tap(function ($collection) {
Log::debug('Values after sorting', $collection->values()->toArray());
})
->shift();
 
// 1

times()

روش استاتیک times یک مجموعه جدید را با فراخوانی callback چند بار ایجاد می کند:

$collection = Collection::times(10, function ($number) {
return $number * 9;
});
 
$collection->all();
 
// [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]

این روش زمانی می تواند مفید باشد که با کارخانه ها برای ایجاد مدل های Eloquent ترکیب شود :

$categories = Collection::times(3, function ($number) {
return factory(Category::class)->create(['name' => "Category No. $number"]);
});
 
$categories->all();
 
/*
[
['id' => 1, 'name' => 'Category No. 1'],
['id' => 2, 'name' => 'Category No. 2'],
['id' => 3, 'name' => 'Category No. 3'],
]
*/

toArray()

این toArray روش مجموعه را به یک PHP ساده تبدیل می کند array . اگر مقادیر مجموعه مدل‌های Eloquent باشند ، مدل‌ها نیز به آرایه‌ها تبدیل می‌شوند:

$collection = collect(['name' => 'Desk', 'price' => 200]);
 
$collection->toArray();
 
/*
[
['name' => 'Desk', 'price' => 200],
]
*/

toArray همچنین تمام اشیاء تودرتوی مجموعه را که نمونه ای از آن هستند Arrayable به یک آرایه تبدیل می کند. اگر می خواهید آرایه زیربنایی خام را بدست آورید، all به جای آن از روش استفاده کنید.

toJson()

متد toJson مجموعه را به یک رشته سریالی JSON تبدیل می کند:

$collection = collect(['name' => 'Desk', 'price' => 200]);
 
$collection->toJson();
 
// '{"name":"Desk", "price":200}'

transform()

متد transform روی مجموعه تکرار می شود و با هر آیتم در مجموعه، فراخوانی داده شده را فراخوانی می کند. اقلام موجود در مجموعه با مقادیر برگشت داده شده توسط callback جایگزین می شوند:

$collection = collect([1, 2, 3, 4, 5]);
 
$collection->transform(function ($item, $key) {
return $item * 2;
});
 
$collection->all();
 
// [2, 4, 6, 8, 10]

بر خلاف بسیاری از روش های جمع آوری دیگر، transform خود مجموعه را اصلاح می کند. اگر می خواهید به جای آن یک مجموعه جدید ایجاد کنید، از map روش استفاده کنید.

union()

متد union آرایه داده شده را به مجموعه اضافه می کند. اگر آرایه داده شده حاوی کلیدهایی باشد که از قبل در مجموعه اصلی هستند، مقادیر مجموعه اصلی ترجیح داده می شوند:

$collection = collect([1 => ['a'], 2 => ['b']]);
 
$union = $collection->union([3 => ['c'], 1 => ['b']]);
 
$union->all();
 
// [1 => ['a'], 2 => ['b'], 3 => ['c']]

unique()

این unique روش همه موارد منحصر به فرد مجموعه را برمی گرداند. مجموعه برگشتی کلیدهای آرایه اصلی را نگه می دارد، بنابراین در این مثال از values روش بازنشانی کلیدها به فهرست های شماره گذاری شده متوالی استفاده می کنیم:

$collection = collect([1, 1, 2, 2, 3, 4, 2]);
 
$unique = $collection->unique();
 
$unique->values()->all();
 
// [1, 2, 3, 4]

هنگام برخورد با آرایه ها یا اشیاء تو در تو، می توانید کلید مورد استفاده برای تعیین منحصر به فرد بودن را مشخص کنید:

$collection = collect([
['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
['name' => 'iPhone 5', 'brand' => 'Apple', 'type' => 'phone'],
['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
]);
 
$unique = $collection->unique('brand');
 
$unique->values()->all();
 
/*
[
['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
]
*/

همچنین می‌توانید برای تعیین منحصربه‌فرد بودن مورد، پاسخ تماس خود را ارسال کنید:

$unique = $collection->unique(function ($item) {
return $item['brand'].$item['type'];
});
 
$unique->values()->all();
 
/*
[
['name' => 'iPhone 6', 'brand' => 'Apple', 'type' => 'phone'],
['name' => 'Apple Watch', 'brand' => 'Apple', 'type' => 'watch'],
['name' => 'Galaxy S6', 'brand' => 'Samsung', 'type' => 'phone'],
['name' => 'Galaxy Gear', 'brand' => 'Samsung', 'type' => 'watch'],
]
*/

این unique روش هنگام بررسی مقادیر آیتم از مقایسه‌های "لست" استفاده می‌کند، به این معنی که رشته‌ای با مقدار صحیح برابر با یک عدد صحیح با همان مقدار در نظر گرفته می‌شود. از روشی برای فیلتر کردن با استفاده از مقایسه های "سخت" استفاده کنید uniqueStrict .

رفتار این روش هنگام استفاده از Eloquent Collections اصلاح می شود .

uniqueStrict()

این روش دارای امضای مشابه unique روش است. با این حال، تمام مقادیر با استفاده از مقایسه "سخت" مقایسه می شوند.

unless()

متد unless فراخوانی داده شده را اجرا می کند مگر اینکه اولین آرگومان داده شده به متد به صورت زیر ارزیابی شود true :

$collection = collect([1, 2, 3]);
 
$collection->unless(true, function ($collection) {
return $collection->push(4);
});
 
$collection->unless(false, function ($collection) {
return $collection->push(5);
});
 
$collection->all();
 
// [1, 2, 3, 5]

برای معکوس unless ، when روش را ببینید.

unlessEmpty()

نام مستعار برای whenNotEmpty روش.

unlessNotEmpty()

نام مستعار برای whenEmpty روش.

unwrap()

روش استاتیک unwrap موارد زیربنایی مجموعه را در صورت اعمال از مقدار داده شده برمی گرداند:

Collection::unwrap(collect('John Doe'));
 
// ['John Doe']
 
Collection::unwrap(['John Doe']);
 
// ['John Doe']
 
Collection::unwrap('John Doe');
 
// 'John Doe'

values()

این values روش مجموعه جدیدی را با کلیدهای تنظیم مجدد به اعداد صحیح متوالی برمی گرداند:

$collection = collect([
10 => ['product' => 'Desk', 'price' => 200],
11 => ['product' => 'Desk', 'price' => 200],
]);
 
$values = $collection->values();
 
$values->all();
 
/*
[
0 => ['product' => 'Desk', 'price' => 200],
1 => ['product' => 'Desk', 'price' => 200],
]
*/

when()

این when متد زمانی که اولین آرگومان داده شده به متد به صورت زیر ارزیابی شود، فراخوانی داده شده را اجرا می کند true :

$collection = collect([1, 2, 3]);
 
$collection->when(true, function ($collection) {
return $collection->push(4);
});
 
$collection->when(false, function ($collection) {
return $collection->push(5);
});
 
$collection->all();
 
// [1, 2, 3, 4]

برای معکوس when ، unless روش را ببینید.

whenEmpty()

این whenEmpty متد زمانی که مجموعه خالی باشد، فراخوانی داده شده را اجرا می کند:

$collection = collect(['michael', 'tom']);
 
$collection->whenEmpty(function ($collection) {
return $collection->push('adam');
});
 
$collection->all();
 
// ['michael', 'tom']
 
 
$collection = collect();
 
$collection->whenEmpty(function ($collection) {
return $collection->push('adam');
});
 
$collection->all();
 
// ['adam']
 
 
$collection = collect(['michael', 'tom']);
 
$collection->whenEmpty(function ($collection) {
return $collection->push('adam');
}, function ($collection) {
return $collection->push('taylor');
});
 
$collection->all();
 
// ['michael', 'tom', 'taylor']

برای معکوس whenEmpty ، whenNotEmpty روش را ببینید.

whenNotEmpty()

این whenNotEmpty متد زمانی که مجموعه خالی نباشد، فراخوانی داده شده را اجرا می کند:

$collection = collect(['michael', 'tom']);
 
$collection->whenNotEmpty(function ($collection) {
return $collection->push('adam');
});
 
$collection->all();
 
// ['michael', 'tom', 'adam']
 
 
$collection = collect();
 
$collection->whenNotEmpty(function ($collection) {
return $collection->push('adam');
});
 
$collection->all();
 
// []
 
 
$collection = collect();
 
$collection->whenNotEmpty(function ($collection) {
return $collection->push('adam');
}, function ($collection) {
return $collection->push('taylor');
});
 
$collection->all();
 
// ['taylor']

برای معکوس whenNotEmpty ، whenEmpty روش را ببینید.

where()

این where روش مجموعه را با یک جفت کلید / مقدار معین فیلتر می کند:

$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Door', 'price' => 100],
]);
 
$filtered = $collection->where('price', 100);
 
$filtered->all();
 
/*
[
['product' => 'Chair', 'price' => 100],
['product' => 'Door', 'price' => 100],
]
*/

این where روش هنگام بررسی مقادیر آیتم از مقایسه‌های "لست" استفاده می‌کند، به این معنی که رشته‌ای با مقدار صحیح برابر با یک عدد صحیح با همان مقدار در نظر گرفته می‌شود. از روشی برای فیلتر کردن با استفاده از مقایسه های "سخت" استفاده کنید whereStrict .

در صورت تمایل، می توانید یک عملگر مقایسه را به عنوان پارامتر دوم ارسال کنید.

$collection = collect([
['name' => 'Jim', 'deleted_at' => '2019-01-01 00:00:00'],
['name' => 'Sally', 'deleted_at' => '2019-01-02 00:00:00'],
['name' => 'Sue', 'deleted_at' => null],
]);
 
$filtered = $collection->where('deleted_at', '!=', null);
 
$filtered->all();
 
/*
[
['name' => 'Jim', 'deleted_at' => '2019-01-01 00:00:00'],
['name' => 'Sally', 'deleted_at' => '2019-01-02 00:00:00'],
]
*/

whereStrict()

این روش دارای امضای مشابه where روش است. با این حال، تمام مقادیر با استفاده از مقایسه "سخت" مقایسه می شوند.

whereBetween()

این whereBetween روش مجموعه را در یک محدوده مشخص فیلتر می کند:

$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 80],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Pencil', 'price' => 30],
['product' => 'Door', 'price' => 100],
]);
 
$filtered = $collection->whereBetween('price', [100, 200]);
 
$filtered->all();
 
/*
[
['product' => 'Desk', 'price' => 200],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Door', 'price' => 100],
]
*/

whereIn()

متد whereIn مجموعه را با یک کلید/مقدار معین موجود در آرایه داده شده فیلتر می کند:

$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Door', 'price' => 100],
]);
 
$filtered = $collection->whereIn('price', [150, 200]);
 
$filtered->all();
 
/*
[
['product' => 'Desk', 'price' => 200],
['product' => 'Bookcase', 'price' => 150],
]
*/

این whereIn روش هنگام بررسی مقادیر آیتم از مقایسه‌های "لست" استفاده می‌کند، به این معنی که رشته‌ای با مقدار صحیح برابر با یک عدد صحیح با همان مقدار در نظر گرفته می‌شود. از روشی برای فیلتر کردن با استفاده از مقایسه های "سخت" استفاده کنید whereInStrict .

whereInStrict()

این روش دارای امضای مشابه whereIn روش است. با این حال، تمام مقادیر با استفاده از مقایسه "سخت" مقایسه می شوند.

whereInstanceOf()

متد whereInstanceOf مجموعه را با یک نوع کلاس مشخص فیلتر می کند:

use App\User;
use App\Post;
 
$collection = collect([
new User,
new User,
new Post,
]);
 
$filtered = $collection->whereInstanceOf(User::class);
 
$filtered->all();
 
// [App\User, App\User]

whereNotBetween()

این whereNotBetween روش مجموعه را در یک محدوده مشخص فیلتر می کند:

$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 80],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Pencil', 'price' => 30],
['product' => 'Door', 'price' => 100],
]);
 
$filtered = $collection->whereNotBetween('price', [100, 200]);
 
$filtered->all();
 
/*
[
['product' => 'Chair', 'price' => 80],
['product' => 'Pencil', 'price' => 30],
]
*/

whereNotIn()

متد whereNotIn مجموعه را با یک کلید/مقدار معین که در آرایه داده شده وجود ندارد فیلتر می کند:

$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Door', 'price' => 100],
]);
 
$filtered = $collection->whereNotIn('price', [150, 200]);
 
$filtered->all();
 
/*
[
['product' => 'Chair', 'price' => 100],
['product' => 'Door', 'price' => 100],
]
*/

این whereNotIn روش هنگام بررسی مقادیر آیتم از مقایسه‌های "لست" استفاده می‌کند، به این معنی که رشته‌ای با مقدار صحیح برابر با یک عدد صحیح با همان مقدار در نظر گرفته می‌شود. از روشی برای فیلتر کردن با استفاده از مقایسه های "سخت" استفاده کنید whereNotInStrict .

whereNotInStrict()

این روش دارای امضای مشابه whereNotIn روش است. با این حال، تمام مقادیر با استفاده از مقایسه "سخت" مقایسه می شوند.

whereNotNull()

متد whereNotNull مواردی را که کلید داده شده خالی نیست فیلتر می کند:

$collection = collect([
['name' => 'Desk'],
['name' => null],
['name' => 'Bookcase'],
]);
 
$filtered = $collection->whereNotNull('name');
 
$filtered->all();
 
/*
[
['name' => 'Desk'],
['name' => 'Bookcase'],
]
*/

whereNull()

متد whereNull مواردی را که کلید داده شده تهی است فیلتر می کند:

$collection = collect([
['name' => 'Desk'],
['name' => null],
['name' => 'Bookcase'],
]);
 
$filtered = $collection->whereNull('name');
 
$filtered->all();
 
/*
[
['name' => null],
]
*/

wrap()

روش استاتیک wrap مقدار داده شده را در صورت امکان در یک مجموعه پیچیده می کند:

$collection = Collection::wrap('John Doe');
 
$collection->all();
 
// ['John Doe']
 
$collection = Collection::wrap(['John Doe']);
 
$collection->all();
 
// ['John Doe']
 
$collection = Collection::wrap(collect('John Doe'));
 
$collection->all();
 
// ['John Doe']

zip()

این zip روش مقادیر آرایه داده شده را با مقادیر مجموعه اصلی در شاخص مربوطه با هم ادغام می کند:

$collection = collect(['Chair', 'Desk']);
 
$zipped = $collection->zip([100, 200]);
 
$zipped->all();
 
// [['Chair', 100], ['Desk', 200]]

پیام های سفارش بالاتر

مجموعه‌ها همچنین از «پیام‌های سفارش بالاتر» پشتیبانی می‌کنند، که میانبرهایی برای انجام اقدامات رایج در مجموعه‌ها هستند. روش های مجموعه ای که پیام های مرتبه بالاتر را ارائه می دهند عبارتند از : average , avg , contains , each , every , filter , first , flatMap , , , , , , groupBy keyBy map max min partition reject skipUntil skipWhile some sortBy sortByDesc sum takeUntil takeWhile unique

هر پیام مرتبه بالاتر می تواند به عنوان یک ویژگی پویا در یک نمونه مجموعه قابل دسترسی باشد. به عنوان مثال، اجازه دهید از each پیام مرتبه بالاتر برای فراخوانی یک متد در هر شیء در یک مجموعه استفاده کنیم:

$users = User::where('votes', '>', 500)->get();
 
$users->each->markAsVip();

به همین ترتیب، ما می توانیم از sum پیام مرتبه بالاتر برای جمع آوری تعداد کل "رای" برای مجموعه ای از کاربران استفاده کنیم:

$users = User::where('group', 'Development')->get();
 
return $users->sum->votes;

مجموعه های تنبل

معرفی

قبل از اینکه درباره مجموعه‌های تنبل لاراول اطلاعات بیشتری کسب کنید، کمی وقت بگذارید تا با ژنراتورهای PHP آشنا شوید .

برای تکمیل Collection کلاس قدرتمند قبلی، کلاس از ژنراتورهای LazyCollection PHP استفاده می کند تا به شما امکان می دهد با مجموعه داده های بسیار بزرگ کار کنید و در عین حال مصرف حافظه را کم نگه دارید.

به عنوان مثال، تصور کنید برنامه شما نیاز به پردازش یک فایل لاگ چند گیگابایتی دارد در حالی که از روش های مجموعه لاراول برای تجزیه لاگ ها استفاده می کند. به جای خواندن یکباره کل فایل در حافظه، ممکن است از مجموعه‌های تنبل استفاده شود تا در یک زمان معین فقط بخش کوچکی از فایل را در حافظه نگه دارند:

use App\LogEntry;
use Illuminate\Support\LazyCollection;
 
LazyCollection::make(function () {
$handle = fopen('log.txt', 'r');
 
while (($line = fgets($handle)) !== false) {
yield $line;
}
})->chunk(4)->map(function ($lines) {
return LogEntry::fromLines($lines);
})->each(function (LogEntry $logEntry) {
// Process the log entry...
});

یا تصور کنید که باید از طریق 10000 مدل Eloquent تکرار کنید. هنگام استفاده از مجموعه های سنتی لاراول، همه 10000 مدل Eloquent باید به طور همزمان در حافظه بارگذاری شوند:

$users = App\User::all()->filter(function ($user) {
return $user->id > 500;
});

با این حال، متد سازنده پرس و جو cursor یک LazyCollection نمونه را برمی گرداند. این به شما این امکان را می دهد که همچنان فقط یک پرس و جو را در مقابل پایگاه داده اجرا کنید، اما تنها یک مدل Eloquent را در هر زمان در حافظه بارگذاری کنید. در این مثال، filter تماس برگشتی اجرا نمی‌شود تا زمانی که در واقع بر روی هر کاربر به‌صورت جداگانه تکرار کنیم، و امکان کاهش شدید مصرف حافظه را فراهم کنیم:

$users = App\User::cursor()->filter(function ($user) {
return $user->id > 500;
});
 
foreach ($users as $user) {
echo $user->id;
}

ایجاد مجموعه های تنبل

برای ایجاد یک نمونه مجموعه تنبل، باید یک تابع مولد PHP را به متد مجموعه ارسال کنید make :

use Illuminate\Support\LazyCollection;
 
LazyCollection::make(function () {
$handle = fopen('log.txt', 'r');
 
while (($line = fgets($handle)) !== false) {
yield $line;
}
});

قرارداد قابل شمارش

تقریباً تمام متدهای موجود در Collection کلاس در کلاس نیز موجود هستند LazyCollection . هر دوی این کلاس ها Illuminate\Support\Enumerable قرارداد را پیاده سازی می کنند که روش های زیر را تعریف می کند:

همه میانگین میانگین تکه سقوط - فروپاشی جمع آوری کنید ترکیب کردن concat شامل شامل Strict شمردن شمارش توسط crossJoin DD تفاوت diffAssoc کلیدهای diff زباله تکراری duplicatesStrict هر یک هر گسترش هر بجز فیلتر اولین اول کجا فلت مپ صاف کردن تلنگر برای صفحه گرفتن دسته بندی بر اساس دارد منفجر شدن تقاطع intersectByKeys خالی است isNotEmpty است پیوستن کلید توسط کلیدها آخر کلان ساختن نقشه نقشه به mapSpread mapToGroups mapWithKeys حداکثر میانه ادغام mergeRecursive دقیقه حالت نهمین فقط پد تقسیم بندی لوله چیدن تصادفی كاهش دادن رد کردن جایگزین کردن جایگزین بازگشتی معکوس جستجو کردن بر زدن جست و خیز کردن تکه مقداری مرتب سازی مرتب سازی بر اساس sortByDesc کلیدهای مرتب سازی sortKeysDesc شکاف مجموع گرفتن ضربه زدن بار به آرایه به جیسون اتحاد. اتصال منحصر بفرد منحصربفردStrict مگر اینکه مگر اینکه خالی باشد مگر اینکه خالی نباشد باز کردن ارزش های چه زمانی وقتی خالی WhenNotEmpty جایی که کجا سخت جایی که بین که در آن WhereInStrict WhereInstanceOf WhereNotBetween WhereNotIn WhereNotInStrict بسته بندی کردن زیپ

متدهایی که مجموعه را تغییر می دهند (مانند shift ، pop و prepend غیره) در کلاس موجود نیستند LazyCollection .

روش های مجموعه تنبل

علاوه بر متدهای تعریف شده در Enumerable قرارداد، LazyCollection کلاس شامل متدهای زیر است:

tapEach()

در حالی که each متد فوراً تماس داده شده را برای هر آیتم در مجموعه فراخوانی می کند، tapEach متد تنها زمانی که آیتم ها یکی یکی از لیست خارج می شوند، تماس داده شده را فراخوانی می کند:

$lazyCollection = LazyCollection::times(INF)->tapEach(function ($value) {
dump($value);
});
 
// Nothing has been dumped so far...
 
$array = $lazyCollection->take(3)->all();
 
// 1
// 2
// 3

remember()

این remember متد یک مجموعه تنبل جدید را برمی‌گرداند که مقادیری را که قبلاً شمارش شده‌اند به خاطر می‌آورد و پس از شمارش مجدد مجموعه، آنها را دوباره بازیابی نمی‌کند:

$users = User::cursor()->remember();
 
// No query has been executed yet...
 
$users->take(5)->all();
 
// The query has been executed and the first 5 users have been hydrated from the database...
 
$users->take(20)->all();
 
// First 5 users come from the collection's cache... The rest are hydrated from the database...