layout: docs title: “컬렉션” —
컬렉션
소개
Illuminate\Support\Collection 클래스는 데이터 배열 작업을 위해 유창하고 편리한 래퍼를 제공합니다. 예를 들어, 다음 코드를 확인하세요. collect 도우미를 사용하여 배열에서 새로운 컬렉션 인스턴스를 생성하고, 각 요소에 strtoupper 함수를 실행한 다음 모든 빈 요소를 제거할 것입니다:
$collection = collect(['Taylor', 'Abigail', null])->map(function (?string $name) {
return strtoupper($name);
})->reject(function (string $name) {
return empty($name);
});
보시다시피, Collection 클래스는 그 메서드를 체인으로 연결하여 기본 배열에 대한 유창한 매핑과 축소를 수행할 수 있게 합니다. 일반적으로 컬렉션은 불변이며, 이는 모든 Collection 메서드가 완전히 새로운 Collection 인스턴스를 반환함을 의미합니다.
컬렉션 생성
위에서 언급했듯이, collect 헬퍼는 주어진 배열에 대해 새로운 Illuminate\Support\Collection 인스턴스를 반환합니다. 따라서 컬렉션을 생성하는 것은 단순히 다음과 같습니다:
$collection = collect([1, 2, 3]);
다음과 같이 make 및 fromJson 메서드를 사용하여 컬렉션을 생성할 수도 있습니다.
[!NOTE] Eloquent 쿼리의 결과는 항상
Collection인스턴스로 반환됩니다.
컬렉션 확장하기
컬렉션은 “매크로 가능”하며, 이는 실행 시간에 Collection 클래스에 추가 메서드를 더할 수 있음을 의미합니다. Illuminate\Support\Collection 클래스의 macro 메서드는 매크로가 호출될 때 실행될 클로저를 받습니다. 매크로 클로저는 마치 컬렉션 클래스의 실제 메서드인 것처럼 $this를 통해 컬렉션의 다른 메서드에 접근할 수 있습니다. 예를 들어, 다음 코드는 Collection 클래스에 toUpper 메서드를 추가합니다:
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
Collection::macro('toUpper', function () {
return $this->map(function (string $value) {
return Str::upper($value);
});
});
$collection = collect(['first', 'second']);
$upper = $collection->toUpper();
// ['FIRST', 'SECOND']
일반적으로, 서비스 제공자의 boot 메서드에서 컬렉션 매크로를 선언해야 합니다.
매크로 인수
필요한 경우, 추가 인수를 받는 매크로를 정의할 수 있습니다:
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Lang;
Collection::macro('toLocale', function (string $locale) {
return $this->map(function (string $value) use ($locale) {
return Lang::get($value, [], $locale);
});
});
$collection = collect(['first', 'second']);
$translated = $collection->toLocale('es');
// ['primero', 'segundo'];
사용 가능한 메서드
나머지 컬렉션 문서의 대부분에 대해, 우리는 Collection 클래스에서 사용할 수 있는 각 메서드에 대해 논의할 것입니다. 기억하세요, 이 모든 메서드는 기본 배열을 유창하게 조작하기 위해 체인 방식으로 연결할 수 있습니다. 또한, 거의 모든 메서드는 새로운 Collection 인스턴스를 반환하므로 필요시 컬렉션의 원본 복사본을 유지할 수 있습니다:
after all average avg before chunk chunkBy chunkWhile collapse collapseWithKeys collect combine concat contains containsStrict count countBy crossJoin dd diff diffAssoc diffAssocUsing diffKeys doesntContain doesntContainStrict dot dump duplicates duplicatesStrict each eachSpread ensure every except filter first firstOrFail firstWhere flatMap flatten flip forget forPage fromJson get groupBy has hasAny hasMany hasSole implode intersect intersectUsing intersectAssoc intersectAssocUsing intersectByKeys isEmpty isNotEmpty join keyBy keys last lazy macro make map mapInto mapSpread mapToGroups mapWithKeys max median merge mergeRecursive min mode multiply nth only pad partition percentage pipe pipeInto pipeThrough pluck pop prepend pull push put random range reduce reduceInto reduceSpread reject replace replaceRecursive reverse search select shift shuffle skip skipUntil skipWhile slice sliding sole some sort sortBy sortByDesc sortDesc sortKeys sortKeysDesc sortKeysUsing splice split splitIn sum take takeUntil takeWhile tap times toArray toJson toPrettyJson transform undot union unique uniqueStrict unless unlessEmpty unlessNotEmpty unwrap value values when whenEmpty whenNotEmpty where whereStrict whereBetween whereIn whereInStrict whereInstanceOf whereNotBetween whereNotIn whereNotInStrict whereNotNull whereNull wrap zip
메서드 목록
after() {.collection-method .first-collection-method}
after 메서드는 주어진 항목 다음의 항목을 반환합니다. 주어진 항목을 찾을 수 없거나 마지막 항목인 경우 null가 반환됩니다:
$collection = collect([1, 2, 3, 4, 5]);
$collection->after(3);
// 4
$collection->after(5);
// null
이 메서드는 주어진 항목을 ‘느슨한’ 비교를 사용하여 검색합니다. 이는 정수 값을 포함하는 문자열이 동일한 값의 정수와 동일하게 간주됨을 의미합니다. ‘엄격한’ 비교를 사용하려면 메서드에 strict 인수를 제공할 수 있습니다.
collect([2, 4, 6, 8])->after('4', strict: true);
// null
또는 주어진 조건을 통과하는 첫 번째 항목을 찾기 위해 직접 클로저를 제공할 수도 있습니다:
collect([2, 4, 6, 8])->after(function (int $item, int $key) {
return $item > 5;
});
// 8
all() {.collection-method}
all 메서드는 컬렉션이 나타내는 기본 배열을 반환합니다:
collect([1, 2, 3])->all();
// [1, 2, 3]
average() {.collection-method}
avg 메서드의 별칭입니다.
avg() {.collection-method}
avg 메서드는 주어진 키의 평균 값을 반환합니다:
$average = collect([
['foo' => 10],
['foo' => 10],
['foo' => 20],
['foo' => 40]
])->avg('foo');
// 20
$average = collect([1, 1, 2, 4])->avg();
// 2
before() {.collection-method}
before 방법은 after 방법의 반대입니다. 주어진 항목 이전의 항목을 반환합니다. 주어진 항목을 찾을 수 없거나 첫 번째 항목일 경우 null가 반환됩니다:
$collection = collect([1, 2, 3, 4, 5]);
$collection->before(3);
// 2
$collection->before(1);
// null
collect([2, 4, 6, 8])->before('4', strict: true);
// null
collect([2, 4, 6, 8])->before(function (int $item, int $key) {
return $item > 5;
});
// 4
chunk() {.collection-method}
chunk 방법은 수집을 주어진 크기의 여러 작은 수집으로 분할합니다:
$collection = collect([1, 2, 3, 4, 5, 6, 7]);
$chunks = $collection->chunk(4);
$chunks->all();
// [[1, 2, 3, 4], [5, 6, 7]]
이 방법은 Bootstrap과 같은 그리드 시스템으로 작업할 때 views에서 특히 유용합니다. 예를 들어, 그리드에 표시하고 싶은 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
chunkBy() {.collection-method}
chunkBy 방법은 주어진 키나 콜백에 대해 동일한 값을 가진 인접 항목들을 그룹화하여 전체 컬렉션을 여러 개의 더 작은 컬렉션으로 나눕니다. 예를 들어, 동일한 부모를 공유하는 인접 제품들을 그룹화할 수 있습니다:
$chunks = $products->chunkBy('parent');
groupBy 방식과 달리, 값이 같지만 인접하지 않은 항목들은 별도의 청크에 배치됩니다:
$collection = collect([1, 1, 2, 2, 1]);
$chunks = $collection->chunkBy(fn (int $value) => $value);
$chunks->all();
// [[1, 1], [2, 2], [1]]
chunkWhile() {.collection-method}
chunkWhile 메서드는 주어진 콜백의 평가를 기반으로 컬렉션을 여러 개의 더 작은 컬렉션으로 나눕니다. 클로저에 전달된 $chunk 변수를 사용하여 이전 요소를 확인할 수 있습니다:
$collection = collect(str_split('AABBCCCD'));
$chunks = $collection->chunkWhile(function (string $value, int $key, Collection $chunk) {
return $value === $chunk->last();
});
$chunks->all();
// [['A', 'A'], ['B', 'B'], ['C', 'C', 'C'], ['D']]
collapse() {.collection-method}
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]
collapseWithKeys() {.collection-method}
collapseWithKeys 메서드는 배열 또는 컬렉션의 컬렉션을 원래 키를 유지한 채 단일 컬렉션으로 평탄화합니다. 컬렉션이 이미 평탄한 경우, 빈 컬렉션을 반환합니다:
$collection = collect([
['first' => collect([1, 2, 3])],
['second' => [4, 5, 6]],
['third' => collect([7, 8, 9])]
]);
$collapsed = $collection->collapseWithKeys();
$collapsed->all();
// [
// 'first' => [1, 2, 3],
// 'second' => [4, 5, 6],
// 'third' => [7, 8, 9],
// ]
collect() {.collection-method}
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();
$collection::class;
// 'Illuminate\Support\Collection'
$collection->all();
// [1, 2, 3]
[!NOTE]
collect메서드는Enumerable인스턴스가 있고 게으르지 않은 컬렉션 인스턴스가 필요할 때 특히 유용합니다.collect()는Enumerable계약의 일부이므로Collection인스턴스를 얻는 데 안전하게 사용할 수 있습니다.
combine() {.collection-method}
combine 메서드는 컬렉션의 값을 키로, 다른 배열이나 컬렉션의 값을 값으로 결합합니다:
$collection = collect(['name', 'age']);
$combined = $collection->combine(['George', 29]);
$combined->all();
// ['name' => 'George', 'age' => 29]
concat() {.collection-method}
concat 메서드는 주어진 배열이나 컬렉션의 값을 다른 컬렉션의 끝에 추가합니다:
$collection = collect(['John Doe']);
$concatenated = $collection->concat(['Jane Doe'])->concat(['name' => 'Johnny Doe']);
$concatenated->all();
// ['John Doe', 'Jane Doe', 'Johnny Doe']
concat 메서드는 원래 컬렉션에 연결된 항목의 키를 숫자로 재색인합니다. 연관 배열에서 키를 유지하려면 merge 메서드를 참조하십시오.
contains() {.collection-method}
contains 메서드는 컬렉션에 특정 항목이 포함되어 있는지 여부를 결정합니다. contains 메서드에 클로저를 전달하여 컬렉션에서 주어진 진리 테스트와 일치하는 요소가 있는지 확인할 수 있습니다:
$collection = collect([1, 2, 3, 4, 5]);
$collection->contains(function (int $value, int $key) {
return $value > 5;
});
// false
또는 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 메서드는 항목 값을 확인할 때 “느슨한” 비교를 사용합니다. 이는 정수 값을 가진 문자열이 동일한 값의 정수와 동일하게 간주됨을 의미합니다. “엄격한” 비교를 사용하여 필터링하려면 containsStrict 메서드를 사용하세요.
contains의 반대는 doesntContain 메서드를 참조하세요.
containsStrict() {.collection-method}
이 메서드는 contains 메서드와 동일한 시그니처를 가지지만, 모든 값들은 “엄격한” 비교를 사용하여 비교됩니다.
[!NOTE] 이 메서드의 동작은 Eloquent Collections를 사용할 때 변경됩니다.
count() {.collection-method}
count 메서드는 컬렉션의 총 항목 수를 반환합니다:
$collection = collect([1, 2, 3, 4]);
$collection->count();
// 4
countBy() {.collection-method}
countBy 메서드는 컬렉션에서 값의 발생 빈도를 계산합니다. 기본적으로, 이 메서드는 모든 요소의 발생 빈도를 계산하며, 이를 통해 컬렉션에서 특정 “유형”의 요소를 계산할 수 있습니다:
$collection = collect([1, 2, 2, 2, 3]);
$counted = $collection->countBy();
$counted->all();
// [1 => 1, 2 => 3, 3 => 1]
사용자 정의 값으로 모든 항목을 계산하기 위해 countBy 메서드에 클로저를 전달할 수 있습니다:
$collection = collect(['alice@gmail.com', 'bob@yahoo.com', 'carlos@gmail.com']);
$counted = $collection->countBy(function (string $email) {
return substr(strrchr($email, '@'), 1);
});
$counted->all();
// ['gmail.com' => 2, 'yahoo.com' => 1]
crossJoin() {.collection-method}
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() {.collection-method}
dd 메서드는 컬렉션의 항목을 출력하고 스크립트의 실행을 종료합니다:
$collection = collect(['John Doe', 'Jane Doe']);
$collection->dd();
/*
array:2 [
0 => "John Doe"
1 => "Jane Doe"
]
*/
스크립트 실행을 중단하고 싶지 않다면 대신 dump 메서드를 사용하세요.
diff() {.collection-method}
diff 메서드는 컬렉션을 다른 컬렉션이나 값 기반의 일반 PHP array와 비교합니다. 이 메서드는 주어진 컬렉션에 존재하지 않는 원래 컬렉션의 값을 반환합니다:
$collection = collect([1, 2, 3, 4, 5]);
$diff = $collection->diff([2, 4, 6, 8]);
$diff->all();
// [1, 3, 5]
[!NOTE] 이 메서드의 동작은 Eloquent 컬렉션을 사용할 때 수정됩니다.
diffAssoc() {.collection-method}
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]
diffAssocUsing() {.collection-method}
diffAssoc와 달리, diffAssocUsing는 인덱스 비교를 위해 사용자가 제공한 콜백 함수를 허용합니다:
$collection = collect([
'color' => 'orange',
'type' => 'fruit',
'remain' => 6,
]);
$diff = $collection->diffAssocUsing([
'Color' => 'yellow',
'Type' => 'fruit',
'Remain' => 3,
], 'strnatcasecmp');
$diff->all();
// ['color' => 'orange', 'remain' => 6]
콜백은 0보다 작거나, 같거나, 큰 정수를 반환하는 비교 함수여야 합니다. 자세한 내용은 PHP 문서의 array_diff_uassoc를 참조하십시오. 이 함수는 diffAssocUsing 메서드가 내부적으로 사용하는 PHP 함수입니다.
diffKeys() {.collection-method}
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]
doesntContain() {.collection-method}
doesntContain 메서드는 컬렉션에 특정 항목이 포함되어 있지 않은지를 결정합니다. doesntContain 메서드에 클로저를 전달하여 주어진 진리 테스트와 일치하는 요소가 컬렉션에 존재하지 않는지 여부를 확인할 수 있습니다:
$collection = collect([1, 2, 3, 4, 5]);
$collection->doesntContain(function (int $value, int $key) {
return $value < 5;
});
// false
또는 doesntContain 메서드에 문자열을 전달하여 컬렉션이 특정 항목 값을 포함하지 않는지 확인할 수 있습니다:
$collection = collect(['name' => 'Desk', 'price' => 100]);
$collection->doesntContain('Table');
// true
$collection->doesntContain('Desk');
// false
또한 doesntContain 메서드에 키/값 쌍을 전달할 수 있으며, 이것은 주어진 쌍이 컬렉션에 존재하지 않는지 여부를 결정합니다:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
]);
$collection->doesntContain('product', 'Bookcase');
// true
doesntContain 메서드는 항목 값을 확인할 때 “느슨한” 비교를 사용하며, 이는 정수 값을 가진 문자열이 동일한 값을 가진 정수와 같다고 간주됨을 의미합니다.
doesntContainStrict() {.collection-method}
이 메서드는 doesntContain 메서드와 동일한 시그니처를 갖지만, 모든 값은 “엄격한” 비교를 사용하여 비교됩니다.
dot() {.collection-method}
dot 메서드는 다차원 컬렉션을 단일 수준 컬렉션으로 평탄화하며, 깊이를 나타내기 위해 “점” 표기법을 사용합니다:
$collection = collect(['products' => ['desk' => ['price' => 100]]]);
$flattened = $collection->dot();
$flattened->all();
// ['products.desk.price' => 100]
dump() {.collection-method}
dump 방법은 컬렉션의 항목을 덤프합니다:
$collection = collect(['John Doe', 'Jane Doe']);
$collection->dump();
/*
array:2 [
0 => "John Doe"
1 => "Jane Doe"
]
*/
컬렉션을 덤프한 후 스크립트 실행을 중단하려면 대신 dd 메서드를 사용하세요.
duplicates() {.collection-method}
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() {.collection-method}
이 메서드는 duplicates 메서드와 동일한 시그니처를 가지지만, 모든 값은 “엄격한” 비교(strict comparison)를 사용하여 비교됩니다.
each() {.collection-method}
each 메서드는 컬렉션의 항목을 반복(iterate)하고 각 항목을 클로저로 전달합니다:
$collection = collect([1, 2, 3, 4]);
$collection->each(function (int $item, int $key) {
// ...
});
항목을 반복 처리하는 것을 중단하고 싶다면, 클로저에서 false를 반환할 수 있습니다:
$collection->each(function (int $item, int $key) {
if (/* condition */) {
return false;
}
});
eachSpread() {.collection-method}
eachSpread 메서드는 컬렉션의 항목을 반복하며, 각 중첩 항목 값을 주어진 콜백으로 전달합니다:
$collection = collect([['John Doe', 35], ['Jane Doe', 33]]);
$collection->eachSpread(function (string $name, int $age) {
// ...
});
콜백에서 false를 반환하여 항목 순회를 중단할 수 있습니다:
$collection->eachSpread(function (string $name, int $age) {
return false;
});
ensure() {.collection-method}
ensure 방법은 컬렉션의 모든 요소가 특정 타입 또는 타입 목록에 속하는지 확인하는 데 사용할 수 있습니다. 그렇지 않으면 UnexpectedValueException가 발생합니다:
return $collection->ensure(User::class);
return $collection->ensure([User::class, Customer::class]);
string, int, float, bool, array와 같은 원시 타입도 지정될 수 있습니다:
return $collection->ensure('int');
[!WARNING]
ensure메서드는 나중에 다른 유형의 요소가 컬렉션에 추가되지 않을 것임을 보장하지 않습니다.
every() {.collection-method}
every 메서드는 컬렉션의 모든 요소가 주어진 진리 검사를 통과하는지 확인하는 데 사용될 수 있습니다:
collect([1, 2, 3, 4])->every(function (int $value, int $key) {
return $value > 2;
});
// false
컬렉션이 비어 있으면 every 메서드는 true를 반환합니다:
$collection = collect([]);
$collection->every(function (int $value, int $key) {
return $value > 2;
});
// true
except() {.collection-method}
except 메서드는 지정된 키를 가진 항목을 제외한 컬렉션의 모든 항목을 반환합니다:
$collection = collect(['product_id' => 1, 'price' => 100, 'discount' => false]);
$filtered = $collection->except(['price', 'discount']);
$filtered->all();
// ['product_id' => 1]
except의 역을 보려면 only 메서드를 참조하십시오.
[!NOTE] 이 메서드의 동작은 Eloquent 컬렉션을 사용할 때 수정됩니다.
filter() {.collection-method}
filter 메서드는 주어진 콜백을 사용하여 컬렉션을 필터링하며, 주어진 조건 검사를 통과하는 항목만 유지합니다:
$collection = collect([1, 2, 3, 4]);
$filtered = $collection->filter(function (int $value, int $key) {
return $value > 2;
});
$filtered->all();
// [3, 4]
콜백이 제공되지 않으면, false와 동일한 컬렉션의 모든 항목이 제거됩니다:
$collection = collect([1, 2, 3, null, false, '', 0, []]);
$collection->filter()->all();
// [1, 2, 3]
filter의 역변환은 reject 메서드를 참조하십시오.
first() {.collection-method}
first 메서드는 주어진 조건을 만족하는 컬렉션의 첫 번째 요소를 반환합니다:
collect([1, 2, 3, 4])->first(function (int $value, int $key) {
return $value > 2;
});
// 3
인수 없이 first 메서드를 호출하여 컬렉션의 첫 번째 요소를 가져올 수도 있습니다. 컬렉션이 비어 있으면 null가 반환됩니다:
collect([1, 2, 3, 4])->first();
// 1
firstOrFail() {.collection-method}
firstOrFail 방법은 first 방법과 동일합니다. 그러나 결과가 없으면 Illuminate\Support\ItemNotFoundException 예외가 발생합니다:
collect([1, 2, 3, 4])->firstOrFail(function (int $value, int $key) {
return $value > 5;
});
// Throws ItemNotFoundException...
firstOrFail 메서드를 인수 없이 호출하여 컬렉션의 첫 번째 요소를 가져올 수도 있습니다. 컬렉션이 비어 있으면 Illuminate\Support\ItemNotFoundException 예외가 발생합니다:
collect([])->firstOrFail();
// Throws ItemNotFoundException...
firstWhere() {.collection-method}
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]
firstWhere 메서드에도 where 메서드처럼 하나의 인수를 전달할 수 있습니다. 이 경우 firstWhere 메서드는 주어진 항목 키의 값이 “truthy”인 첫 번째 항목을 반환합니다:
$collection->firstWhere('age');
// ['name' => 'Linda', 'age' => 14]
flatMap() {.collection-method}
flatMap 메서드는 컬렉션을 반복하며 각 값을 주어진 클로저로 전달합니다. 클로저는 항목을 자유롭게 수정하고 이를 반환할 수 있으며, 이를 통해 수정된 항목들로 이루어진 새로운 컬렉션이 형성됩니다. 그런 다음 배열은 한 단계 평탄화됩니다:
$collection = collect([
['name' => 'Sally'],
['school' => 'Arkansas'],
['age' => 28]
]);
$flattened = $collection->flatMap(function (array $values) {
return array_map('strtoupper', $values);
});
$flattened->all();
// ['name' => 'SALLY', 'school' => 'ARKANSAS', 'age' => '28'];
flatten() {.collection-method}
flatten 방법은 다차원 컬렉션을 단일 차원으로 평탄화합니다:
$collection = collect([
'name' => 'Taylor',
'languages' => [
'PHP', 'JavaScript'
]
]);
$flattened = $collection->flatten();
$flattened->all();
// ['Taylor', 'PHP', 'JavaScript'];
필요한 경우, flatten 메서드에 “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() {.collection-method}
flip 메서드는 컬렉션의 키와 해당 값을 서로 바꿉니다:
$collection = collect(['name' => 'Taylor', 'framework' => 'Laravel']);
$flipped = $collection->flip();
$flipped->all();
// ['Taylor' => 'name', 'Laravel' => 'framework']
forget() {.collection-method}
forget 메서드는 키를 사용하여 컬렉션에서 항목을 제거합니다:
$collection = collect(['name' => 'Taylor', 'framework' => 'Laravel']);
// Forget a single key...
$collection->forget('name');
// ['framework' => 'Laravel']
// Forget multiple keys...
$collection->forget(['name', 'framework']);
// []
[!WARNING] 대부분의 다른 컬렉션 메서드와 달리,
forget는 새로운 수정된 컬렉션을 반환하지 않고, 호출된 컬렉션을 수정한 후 반환합니다.
forPage() {.collection-method}
forPage 메서드는 주어진 페이지 번호에 나타날 항목들을 포함하는 새로운 컬렉션을 반환합니다. 이 메서드는 페이지 번호를 첫 번째 인자로 받고, 페이지당 표시할 항목 수를 두 번째 인자로 받습니다:
$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]);
$chunk = $collection->forPage(2, 3);
$chunk->all();
// [4, 5, 6]
fromJson() {.collection-method}
정적 fromJson 메서드는 json_decode PHP 함수를 사용하여 주어진 JSON 문자열을 디코딩함으로써 새로운 컬렉션 인스턴스를 생성합니다:
use Illuminate\Support\Collection;
$json = json_encode([
'name' => 'Taylor Otwell',
'role' => 'Developer',
'status' => 'Active',
]);
$collection = Collection::fromJson($json);
get() {.collection-method}
get 메서드는 주어진 키에 있는 항목을 반환합니다. 키가 존재하지 않으면, null가 반환됩니다:
$collection = collect(['name' => 'Taylor', 'framework' => 'Laravel']);
$value = $collection->get('name');
// Taylor
두 번째 인수로 선택적으로 기본 값을 전달할 수 있습니다:
$collection = collect(['name' => 'Taylor', 'framework' => 'Laravel']);
$value = $collection->get('age', 34);
// 34
메서드의 기본값으로 콜백을 전달할 수도 있습니다. 지정된 키가 존재하지 않는 경우 콜백의 결과가 반환됩니다:
$collection->get('email', function () {
return 'taylor@example.com';
});
// taylor@example.com
groupBy() {.collection-method}
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->all();
/*
[
'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 (array $item, int $key) {
return substr($item['account_id'], -3);
});
$grouped->all();
/*
[
'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 (array $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() {.collection-method}
has 메서드는 주어진 키가 컬렉션에 존재하는지 여부를 결정합니다:
$collection = collect(['account_id' => 1, 'product' => 'Desk', 'amount' => 5]);
$collection->has('product');
// true
$collection->has(['product', 'amount']);
// true
$collection->has(['amount', 'price']);
// false
hasAny() {.collection-method}
hasAny 메서드는 주어진 키들 중 어느 것이 컬렉션에 존재하는지 여부를 결정합니다:
$collection = collect(['account_id' => 1, 'product' => 'Desk', 'amount' => 5]);
$collection->hasAny(['product', 'price']);
// true
$collection->hasAny(['name', 'price']);
// false
hasMany() {.collection-method}
hasMany 메서드는 컬렉션에 여러 항목이 포함되어 있는지 여부를 결정합니다:
collect([])->hasMany();
// false
collect(['1'])->hasMany();
// false
collect([1, 2, 3])->hasMany();
// true
collect([
['age' => 2],
['age' => 3],
])->hasMany(fn ($item) => $item['age'] === 2);
// false
hasSole() {.collection-method}
hasSole 메서드는 컬렉션이 단일 항목을 포함하는지 여부를 결정하며, 선택적으로 주어진 기준과 일치하는지 확인합니다:
collect([])->hasSole();
// false
collect(['1'])->hasSole();
// true
collect([1, 2, 3])->hasSole(fn (int $item) => $item === 2);
// true
implode() {.collection-method}
implode 메서드는 컬렉션의 항목들을 결합합니다. 그 인수는 컬렉션에 있는 항목의 유형에 따라 달라집니다. 컬렉션에 배열이나 객체가 포함되어 있으면, 결합하려는 속성의 키와 값 사이에 넣고 싶은 “글루” 문자열을 전달해야 합니다:
$collection = collect([
['account_id' => 1, 'product' => 'Desk'],
['account_id' => 2, 'product' => 'Chair'],
]);
$collection->implode('product', ', ');
// 'Desk, Chair'
컬렉션에 단순 문자열이나 숫자 값이 포함되어 있는 경우, 메서드에 “glue”를 유일한 인수로 전달해야 합니다:
collect([1, 2, 3, 4, 5])->implode('-');
// '1-2-3-4-5'
값을 합치는 동안 형식을 지정하고 싶다면 implode 메서드에 클로저를 전달할 수 있습니다:
$collection->implode(function (array $item, int $key) {
return strtoupper($item['product']);
}, ', ');
// 'DESK, CHAIR'
intersect() {.collection-method}
intersect 메서드는 주어진 배열이나 컬렉션에 존재하지 않는 원래 컬렉션의 값을 제거합니다. 결과 컬렉션은 원래 컬렉션의 키를 유지합니다:
$collection = collect(['Desk', 'Sofa', 'Chair']);
$intersect = $collection->intersect(['Desk', 'Chair', 'Bookcase']);
$intersect->all();
// [0 => 'Desk', 2 => 'Chair']
[!NOTE] 이 메서드의 동작은 Eloquent 컬렉션을 사용할 때 수정됩니다.
intersectUsing() {.collection-method}
intersectUsing 메서드는 주어진 배열이나 컬렉션에 존재하지 않는 값을 원래 컬렉션에서 제거하며, 사용자 정의 콜백을 사용하여 값을 비교합니다. 결과 컬렉션은 원래 컬렉션의 키를 유지합니다:
$collection = collect(['Desk', 'Sofa', 'Chair']);
$intersect = $collection->intersectUsing(['desk', 'chair', 'bookcase'], function (string $a, string $b) {
return strcasecmp($a, $b);
});
$intersect->all();
// [0 => 'Desk', 2 => 'Chair']
intersectAssoc() {.collection-method}
intersectAssoc 메서드는 원래 컬렉션을 다른 컬렉션이나 배열과 비교하며, 주어진 모든 컬렉션에 존재하는 키/값 쌍을 반환합니다:
$collection = collect([
'color' => 'red',
'size' => 'M',
'material' => 'cotton'
]);
$intersect = $collection->intersectAssoc([
'color' => 'blue',
'size' => 'M',
'material' => 'polyester'
]);
$intersect->all();
// ['size' => 'M']
intersectAssocUsing() {.collection-method}
intersectAssocUsing 방법은 원래 컬렉션을 다른 컬렉션 또는 배열과 비교하여, 두 컬렉션 모두에 존재하는 키/값 쌍을 반환하며, 사용자 정의 비교 콜백을 사용하여 키와 값 모두의 동등성을 결정합니다:
$collection = collect([
'color' => 'red',
'Size' => 'M',
'material' => 'cotton',
]);
$intersect = $collection->intersectAssocUsing([
'color' => 'blue',
'size' => 'M',
'material' => 'polyester',
], function (string $a, string $b) {
return strcasecmp($a, $b);
});
$intersect->all();
// ['Size' => 'M']
intersectByKeys() {.collection-method}
intersectByKeys 방법은 주어진 배열이나 컬렉션에 존재하지 않는 원래 컬렉션의 모든 키와 해당 값을 제거합니다:
$collection = collect([
'serial' => 'UX301', 'type' => 'screen', 'year' => 2009,
]);
$intersect = $collection->intersectByKeys([
'reference' => 'UX404', 'type' => 'tab', 'year' => 2011,
]);
$intersect->all();
// ['type' => 'screen', 'year' => 2009]
isEmpty() {.collection-method}
isEmpty 메서드는 컬렉션이 비어 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다:
collect([])->isEmpty();
// true
isNotEmpty() {.collection-method}
isNotEmpty 메서드는 컬렉션이 비어 있지 않으면 true를 반환하고, 그렇지 않으면 false가 반환됩니다:
collect([])->isNotEmpty();
// false
join() {.collection-method}
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() {.collection-method}
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 (array $item, int $key) {
return strtoupper($item['product_id']);
});
$keyed->all();
/*
[
'PROD-100' => ['product_id' => 'prod-100', 'name' => 'Desk'],
'PROD-200' => ['product_id' => 'prod-200', 'name' => 'Chair'],
]
*/
keys() {.collection-method}
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() {.collection-method}
last 메서드는 주어진 진리 검사를 통과하는 컬렉션의 마지막 요소를 반환합니다:
collect([1, 2, 3, 4])->last(function (int $value, int $key) {
return $value < 3;
});
// 2
인수 없이 last 메서드를 호출하여 컬렉션의 마지막 요소를 가져올 수도 있습니다. 컬렉션이 비어 있는 경우 null가 반환됩니다:
collect([1, 2, 3, 4])->last();
// 4
lazy() {.collection-method}
lazy 메서드는 항목의 기본 배열에서 새로운 LazyCollection 인스턴스를 반환합니다:
$lazyCollection = collect([1, 2, 3, 4])->lazy();
$lazyCollection::class;
// Illuminate\Support\LazyCollection
$lazyCollection->all();
// [1, 2, 3, 4]
이것은 많은 항목을 포함하는 거대한 Collection에서 변환을 수행해야 할 때 특히 유용합니다:
$count = $hugeCollection
->lazy()
->where('country', 'FR')
->where('balance', '>', '100')
->count();
컬렉션을 LazyCollection로 변환하면 추가 메모리를 많이 할당할 필요가 없습니다. 원래 컬렉션은 여전히 자체 값을 메모리에 유지하지만, 이후의 필터들은 그렇지 않습니다. 따라서 컬렉션의 결과를 필터링할 때 사실상 추가 메모리가 할당되지 않습니다.
macro() {.collection-method}
정적 macro 메서드를 사용하면 런타임에 Collection 클래스에 메서드를 추가할 수 있습니다. 자세한 내용은 컬렉션 확장 문서를 참조하세요.
make() {.collection-method}
정적 make 메서드는 새 컬렉션 인스턴스를 생성합니다. 컬렉션 생성 섹션을 참조하세요.
use Illuminate\Support\Collection;
$collection = Collection::make([1, 2, 3]);
map() {.collection-method}
map 메서드는 컬렉션을 반복하며 각 값을 지정된 콜백에 전달합니다. 콜백은 항목을 자유롭게 수정하고 반환할 수 있으며, 따라서 수정된 항목들로 이루어진 새로운 컬렉션을 형성합니다:
$collection = collect([1, 2, 3, 4, 5]);
$multiplied = $collection->map(function (int $item, int $key) {
return $item * 2;
});
$multiplied->all();
// [2, 4, 6, 8, 10]
[!WARNING] 대부분의 다른 컬렉션 메서드와 마찬가지로,
map는 새로운 컬렉션 인스턴스를 반환합니다; 호출된 컬렉션을 수정하지 않습니다. 원래 컬렉션을 변환하려면 transform 메서드를 사용하세요.
mapInto() {.collection-method}
mapInto() 메서드는 컬렉션을 반복하면서 값을 생성자에 전달하여 주어진 클래스의 새로운 인스턴스를 생성합니다:
class Currency
{
/**
* Create a new currency instance.
*/
function __construct(
public string $code,
) {}
}
$collection = collect(['USD', 'EUR', 'GBP']);
$currencies = $collection->mapInto(Currency::class);
$currencies->all();
// [Currency('USD'), Currency('EUR'), Currency('GBP')]
mapSpread() {.collection-method}
mapSpread 메서드는 컬렉션의 항목을 반복하며 각 중첩 항목 값을 지정된 클로저에 전달합니다. 클로저는 항목을 수정하고 이를 반환할 수 있으며, 이를 통해 수정된 항목들로 이루어진 새로운 컬렉션을 형성합니다:
$collection = collect([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
$chunks = $collection->chunk(2);
$sequence = $chunks->mapSpread(function (int $even, int $odd) {
return $even + $odd;
});
$sequence->all();
// [1, 5, 9, 13, 17]
mapToGroups() {.collection-method}
mapToGroups 메서드는 컬렉션의 항목들을 주어진 클로저에 따라 그룹화합니다. 클로저는 단일 키/값 쌍을 포함하는 연관 배열을 반환해야 하며, 이를 통해 그룹화된 값들의 새로운 컬렉션이 형성됩니다:
$collection = collect([
[
'name' => 'John Doe',
'department' => 'Sales',
],
[
'name' => 'Jane Doe',
'department' => 'Sales',
],
[
'name' => 'Johnny Doe',
'department' => 'Marketing',
]
]);
$grouped = $collection->mapToGroups(function (array $item, int $key) {
return [$item['department'] => $item['name']];
});
$grouped->all();
/*
[
'Sales' => ['John Doe', 'Jane Doe'],
'Marketing' => ['Johnny Doe'],
]
*/
$grouped->get('Sales')->all();
// ['John Doe', 'Jane Doe']
mapWithKeys() {.collection-method}
mapWithKeys 메서드는 컬렉션을 반복하며 각 값을 주어진 콜백으로 전달합니다. 콜백은 단일 키/값 쌍을 포함하는 연관 배열을 반환해야 합니다:
$collection = collect([
[
'name' => 'John',
'department' => 'Sales',
'email' => 'john@example.com',
],
[
'name' => 'Jane',
'department' => 'Marketing',
'email' => 'jane@example.com',
]
]);
$keyed = $collection->mapWithKeys(function (array $item, int $key) {
return [$item['email'] => $item['name']];
});
$keyed->all();
/*
[
'john@example.com' => 'John',
'jane@example.com' => 'Jane',
]
*/
max() {.collection-method}
max 메서드는 주어진 키의 최대 값을 반환합니다:
$max = collect([
['foo' => 10],
['foo' => 20]
])->max('foo');
// 20
$max = collect([1, 2, 3, 4, 5])->max();
// 5
median() {.collection-method}
median 메서드는 주어진 키의 중앙 값을 반환합니다:
$median = collect([
['foo' => 10],
['foo' => 10],
['foo' => 20],
['foo' => 40]
])->median('foo');
// 15
$median = collect([1, 1, 2, 4])->median();
// 1.5
merge() {.collection-method}
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() {.collection-method}
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() {.collection-method}
min 메서드는 주어진 키의 최소값을 반환합니다:
$min = collect([
['foo' => 10],
['foo' => 20]
])->min('foo');
// 10
$min = collect([1, 2, 3, 4, 5])->min();
// 1
mode() {.collection-method}
mode 메서드는 주어진 키의 최빈값을 반환합니다:
$mode = collect([
['foo' => 10],
['foo' => 10],
['foo' => 20],
['foo' => 40]
])->mode('foo');
// [10]
$mode = collect([1, 1, 2, 4])->mode();
// [1]
$mode = collect([1, 1, 2, 2])->mode();
// [1, 2]
multiply() {.collection-method}
multiply 메서드는 컬렉션의 모든 항목을 지정된 수만큼 복사합니다:
$users = collect([
['name' => 'User #1', 'email' => 'user1@example.com'],
['name' => 'User #2', 'email' => 'user2@example.com'],
])->multiply(3);
/*
[
['name' => 'User #1', 'email' => 'user1@example.com'],
['name' => 'User #2', 'email' => 'user2@example.com'],
['name' => 'User #1', 'email' => 'user1@example.com'],
['name' => 'User #2', 'email' => 'user2@example.com'],
['name' => 'User #1', 'email' => 'user1@example.com'],
['name' => 'User #2', 'email' => 'user2@example.com'],
]
*/
nth() {.collection-method}
nth 방법은 매 n번째 요소로 구성된 새 컬렉션을 생성합니다:
$collection = collect(['a', 'b', 'c', 'd', 'e', 'f']);
$collection->nth(4);
// ['a', 'e']
두 번째 인수로 선택적으로 시작 오프셋을 전달할 수 있습니다:
$collection->nth(4, 1);
// ['b', 'f']
only() {.collection-method}
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의 역을 보려면 except 메서드를 참조하세요.
[!NOTE] 이 메서드의 동작은 Eloquent Collections을 사용할 때 수정됩니다.
pad() {.collection-method}
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() {.collection-method}
partition 방법은 PHP 배열 구조 분해와 결합하여 주어진 조건 검사를 통과하는 요소와 통과하지 않는 요소를 분리할 수 있습니다:
$collection = collect([1, 2, 3, 4, 5, 6]);
[$underThree, $equalOrAboveThree] = $collection->partition(function (int $i) {
return $i < 3;
});
$underThree->all();
// [1, 2]
$equalOrAboveThree->all();
// [3, 4, 5, 6]
[!NOTE] 이 메서드의 동작은 Eloquent 컬렉션과 상호작용할 때 변경됩니다.
percentage() {.collection-method}
percentage 메서드는 컬렉션 내 항목 중 주어진 진리 테스트를 통과하는 항목의 비율을 빠르게 확인하는 데 사용될 수 있습니다:
$collection = collect([1, 1, 2, 2, 2, 3]);
$percentage = $collection->percentage(fn (int $value) => $value === 1);
// 33.33
기본적으로 백분율은 소수점 두 자리로 반올림됩니다. 그러나 메서드에 두 번째 인수를 제공하여 이 동작을 사용자 정의할 수 있습니다:
$percentage = $collection->percentage(fn (int $value) => $value === 1, precision: 3);
// 33.333
pipe() {.collection-method}
pipe 메서드는 컬렉션을 주어진 클로저에 전달하고 실행된 클로저의 결과를 반환합니다:
$collection = collect([1, 2, 3]);
$piped = $collection->pipe(function (Collection $collection) {
return $collection->sum();
});
// 6
pipeInto() {.collection-method}
pipeInto 메서드는 주어진 클래스의 새 인스턴스를 생성하고 컬렉션을 생성자에 전달합니다:
class ResourceCollection
{
/**
* Create a new ResourceCollection instance.
*/
public function __construct(
public Collection $collection,
) {}
}
$collection = collect([1, 2, 3]);
$resource = $collection->pipeInto(ResourceCollection::class);
$resource->collection->all();
// [1, 2, 3]
pipeThrough() {.collection-method}
pipeThrough 메서드는 컬렉션을 지정된 클로저 배열에 전달하고 실행된 클로저의 결과를 반환합니다:
use Illuminate\Support\Collection;
$collection = collect([1, 2, 3]);
$result = $collection->pipeThrough([
function (Collection $collection) {
return $collection->merge([4, 5]);
},
function (Collection $collection) {
return $collection->sum();
},
]);
// 15
pluck() {.collection-method}
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([
[
'name' => 'Laracon',
'speakers' => [
'first_day' => ['Rosa', 'Judith'],
],
],
[
'name' => 'VueConf',
'speakers' => [
'first_day' => ['Abigail', 'Joey'],
],
],
]);
$plucked = $collection->pluck('speakers.first_day');
$plucked->all();
// [['Rosa', 'Judith'], ['Abigail', 'Joey']]
중복된 키가 존재하면, 마지막으로 일치하는 요소가 선택된 컬렉션에 삽입됩니다:
$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() {.collection-method}
pop 메서드는 컬렉션의 마지막 항목을 제거하고 반환합니다. 컬렉션이 비어 있으면 null가 반환됩니다:
$collection = collect([1, 2, 3, 4, 5]);
$collection->pop();
// 5
$collection->all();
// [1, 2, 3, 4]
pop 메서드에 정수를 전달하여 컬렉션의 끝에서 여러 항목을 제거하고 반환할 수 있습니다:
$collection = collect([1, 2, 3, 4, 5]);
$collection->pop(3);
// collect([5, 4, 3])
$collection->all();
// [1, 2]
prepend() {.collection-method}
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() {.collection-method}
pull 메서드는 키로 컬렉션에서 항목을 제거하고 반환합니다:
$collection = collect(['product_id' => 'prod-100', 'name' => 'Desk']);
$collection->pull('name');
// 'Desk'
$collection->all();
// ['product_id' => 'prod-100']
push() {.collection-method}
push 메서드는 컬렉션의 끝에 항목을 추가합니다:
$collection = collect([1, 2, 3, 4]);
$collection->push(5);
$collection->all();
// [1, 2, 3, 4, 5]
컬렉션 끝에 추가할 여러 항목을 제공할 수도 있습니다:
$collection = collect([1, 2, 3, 4]);
$collection->push(5, 6, 7);
$collection->all();
// [1, 2, 3, 4, 5, 6, 7]
put() {.collection-method}
put 메서드는 컬렉션에 주어진 키와 값을 설정합니다:
$collection = collect(['product_id' => 1, 'name' => 'Desk']);
$collection->put('price', 100);
$collection->all();
// ['product_id' => 1, 'name' => 'Desk', 'price' => 100]
random() {.collection-method}
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)
컬렉션 인스턴스에 요청된 항목보다 적은 항목이 있는 경우, random 메서드는 InvalidArgumentException를 발생시킵니다.
random 메서드는 클로저도 허용하며, 이 클로저는 현재 컬렉션 인스턴스를 받게 됩니다:
use Illuminate\Support\Collection;
$random = $collection->random(fn (Collection $items) => min(10, count($items)));
$random->all();
// [1, 2, 3, 4, 5] - (retrieved randomly)
range() {.collection-method}
range 메서드는 지정된 범위 사이의 정수를 포함하는 컬렉션을 반환합니다:
$collection = collect()->range(3, 6);
$collection->all();
// [3, 4, 5, 6]
reduce() {.collection-method}
reduce 방법은 컬렉션을 단일 값으로 축소하며, 각 반복의 결과를 다음 반복으로 전달합니다:
$collection = collect([1, 2, 3]);
$total = $collection->reduce(function (?int $carry, int $item) {
return $carry + $item;
});
// 6
첫 번째 반복에서 $carry의 값은 null입니다. 그러나 reduce에 두 번째 인수를 전달하여 초기 값을 지정할 수 있습니다:
$collection->reduce(function (int $carry, int $item) {
return $carry + $item;
}, 4);
// 10
reduce 메서드는 배열 키도 주어진 콜백으로 전달합니다:
$collection = collect([
'usd' => 1400,
'gbp' => 1200,
'eur' => 1000,
]);
$ratio = [
'usd' => 1,
'gbp' => 1.37,
'eur' => 1.22,
];
$collection->reduce(function (int $carry, int $value, string $key) use ($ratio) {
return $carry + ($value * $ratio[$key]);
}, 0);
// 4264
reduceInto() {.collection-method}
reduceInto 메서드는 주어진 초기 값을 변형하여 컬렉션을 단일 값으로 축소합니다. reduce 메서드와 달리, 주어진 콜백은 축적된 값을 반환할 필요가 없습니다:
class OrderStats
{
public int $total = 0;
public int $count = 0;
}
$orders = collect([
['amount' => 100],
['amount' => 250],
['amount' => 50],
]);
$stats = $orders->reduceInto(new OrderStats, function (OrderStats $stats, array $order) {
$stats->total += $order['amount'];
$stats->count++;
});
$stats->total;
// 400
스칼라나 배열로 축소할 때는 콜백에서 참조로 받아야 변형이 원본 값에 적용됩니다:
$collection = collect([1, 2, 3, 4, 5]);
$even = $collection->reduceInto([], function (array &$result, int $value) {
if ($value % 2 === 0) {
$result[] = $value;
}
});
// [2, 4]
reduceSpread() {.collection-method}
reduceSpread 메서드는 컬렉션을 값의 배열로 축소하며, 각 반복의 결과를 다음 반복으로 전달합니다. 이 메서드는 reduce 메서드와 유사하지만, 여러 초기 값을 받을 수 있습니다:
[$creditsRemaining, $batch] = Image::where('status', 'unprocessed')
->get()
->reduceSpread(function (int $creditsRemaining, Collection $batch, Image $image) {
if ($creditsRemaining >= $image->creditsRequired()) {
$batch->push($image);
$creditsRemaining -= $image->creditsRequired();
}
return [$creditsRemaining, $batch];
}, $creditsAvailable, collect());
reject() {.collection-method}
reject 메서드는 주어진 클로저를 사용하여 컬렉션을 필터링합니다. 클로저는 항목이 결과 컬렉션에서 제거되어야 하면 true를 반환해야 합니다:
$collection = collect([1, 2, 3, 4]);
$filtered = $collection->reject(function (int $value, int $key) {
return $value > 2;
});
$filtered->all();
// [1, 2]
reject 메서드의 역은 filter 메서드를 참조하세요.
replace() {.collection-method}
replace 메서드는 merge와 유사하게 동작합니다. 그러나 문자열 키와 일치하는 항목을 덮어쓰는 것 외에도, replace 메서드는 숫자 키와 일치하는 컬렉션의 항목도 덮어씁니다:
$collection = collect(['Taylor', 'Abigail', 'James']);
$replaced = $collection->replace([1 => 'Victoria', 3 => 'Finn']);
$replaced->all();
// ['Taylor', 'Victoria', 'James', 'Finn']
replaceRecursive() {.collection-method}
replaceRecursive 방법은 replace와 비슷하게 작동하지만, 배열로 재귀하여 내부 값에도 동일한 대체 과정을 적용합니다:
$collection = collect([
'Taylor',
'Abigail',
[
'James',
'Victoria',
'Finn'
]
]);
$replaced = $collection->replaceRecursive([
'Charlie',
2 => [1 => 'King']
]);
$replaced->all();
// ['Charlie', 'Abigail', ['James', 'King', 'Finn']]
reverse() {.collection-method}
reverse 방법은 원래 키를 유지하면서 컬렉션 항목의 순서를 반대로 합니다:
$collection = collect(['a', 'b', 'c', 'd', 'e']);
$reversed = $collection->reverse();
$reversed->all();
/*
[
4 => 'e',
3 => 'd',
2 => 'c',
1 => 'b',
0 => 'a',
]
*/
search() {.collection-method}
search 메서드는 컬렉션에서 주어진 값을 검색하고, 찾으면 그 키를 반환합니다. 항목을 찾을 수 없으면 false가 반환됩니다:
$collection = collect([2, 4, 6, 8]);
$collection->search(4);
// 1
검색은 ‘느슨한’ 비교를 사용하여 수행되며, 이는 정수 값을 가진 문자열이 동일한 값의 정수와 같다고 간주됨을 의미합니다. ‘엄격한’ 비교를 사용하려면 메서드의 두 번째 인수로 true를 전달하십시오:
collect([2, 4, 6, 8])->search('4', strict: true);
// false
또는 주어진 조건을 통과하는 첫 번째 항목을 찾기 위해 직접 클로저를 제공할 수도 있습니다:
collect([2, 4, 6, 8])->search(function (int $item, int $key) {
return $item > 5;
});
// 2
select() {.collection-method}
select 방법은 SQL SELECT 문과 유사하게 컬렉션에서 지정된 키를 선택합니다:
$users = collect([
['name' => 'Taylor Otwell', 'role' => 'Developer', 'status' => 'active'],
['name' => 'Victoria Faith', 'role' => 'Researcher', 'status' => 'active'],
]);
$users->select(['name', 'role']);
/*
[
['name' => 'Taylor Otwell', 'role' => 'Developer'],
['name' => 'Victoria Faith', 'role' => 'Researcher'],
],
*/
shift() {.collection-method}
shift 메서드는 컬렉션에서 첫 번째 항목을 제거하고 반환합니다:
$collection = collect([1, 2, 3, 4, 5]);
$collection->shift();
// 1
$collection->all();
// [2, 3, 4, 5]
shift 메서드에 정수를 전달하여 컬렉션의 시작 부분에서 여러 항목을 제거하고 반환할 수 있습니다:
$collection = collect([1, 2, 3, 4, 5]);
$collection->shift(3);
// collect([1, 2, 3])
$collection->all();
// [4, 5]
shuffle() {.collection-method}
shuffle 방법은 컬렉션의 항목들을 무작위로 섞습니다:
$collection = collect([1, 2, 3, 4, 5]);
$shuffled = $collection->shuffle();
$shuffled->all();
// [3, 2, 5, 1, 4] - (generated randomly)
skip() {.collection-method}
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() {.collection-method}
skipUntil 메서드는 주어진 콜백이 false를 반환하는 동안 컬렉션의 항목을 건너뜁니다. 콜백이 true를 반환하면 컬렉션에 남아 있는 모든 항목이 새로운 컬렉션으로 반환됩니다:
$collection = collect([1, 2, 3, 4]);
$subset = $collection->skipUntil(function (int $item) {
return $item >= 3;
});
$subset->all();
// [3, 4]
주어진 값이 발견될 때까지 모든 항목을 건너뛰기 위해 단순 값을 skipUntil 메서드에 전달할 수도 있습니다:
$collection = collect([1, 2, 3, 4]);
$subset = $collection->skipUntil(3);
$subset->all();
// [3, 4]
[!WARNING] 주어진 값을 찾지 못하거나 콜백이
true를 반환하지 않으면,skipUntil메서드는 빈 컬렉션을 반환합니다.
skipWhile() {.collection-method}
skipWhile 메서드는 주어진 콜백이 true를 반환하는 동안 컬렉션의 항목을 건너뜁니다. 콜백이 false를 반환하면 컬렉션에 남아 있는 모든 항목이 새 컬렉션으로 반환됩니다:
$collection = collect([1, 2, 3, 4]);
$subset = $collection->skipWhile(function (int $item) {
return $item <= 3;
});
$subset->all();
// [4]
[!WARNING] 콜백이
false를 반환하지 않으면,skipWhile메서드는 빈 컬렉션을 반환합니다.
slice() {.collection-method}
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 메서드를 사용하여 키를 다시 인덱싱할 수 있습니다.
sliding() {.collection-method}
sliding 메서드는 컬렉션의 항목을 “슬라이딩 윈도우” 형태로 나타내는 청크들로 구성된 새로운 컬렉션을 반환합니다:
$collection = collect([1, 2, 3, 4, 5]);
$chunks = $collection->sliding(2);
$chunks->toArray();
// [[1, 2], [2, 3], [3, 4], [4, 5]]
이는 특히 eachSpread 메서드와 함께 사용할 때 유용합니다:
$transactions->sliding(2)->eachSpread(function (Collection $previous, Collection $current) {
$current->total = $previous->total + $current->amount;
});
두 번째 ‘단계’ 값을 선택적으로 전달할 수 있으며, 이는 각 청크의 첫 번째 항목 사이의 거리를 결정합니다:
$collection = collect([1, 2, 3, 4, 5]);
$chunks = $collection->sliding(3, step: 2);
$chunks->toArray();
// [[1, 2, 3], [3, 4, 5]]
sole() {.collection-method}
sole 메서드는 주어진 참 테스트를 통과하는 컬렉션의 첫 번째 요소를 반환하지만, 참 테스트가 정확히 하나의 요소와 일치하는 경우에만 반환합니다:
collect([1, 2, 3, 4])->sole(function (int $value, int $key) {
return $value === 2;
});
// 2
또한 sole 메서드에 키/값 쌍을 전달할 수 있으며, 이는 주어진 쌍과 일치하는 컬렉션의 첫 번째 요소를 반환하지만, 정확히 하나의 요소만 일치하는 경우에만 반환됩니다:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
]);
$collection->sole('product', 'Chair');
// ['product' => 'Chair', 'price' => 100]
또는 인수가 없는 sole 메서드를 호출하여 컬렉션에 요소가 하나만 있는 경우 첫 번째 요소를 가져올 수도 있습니다:
$collection = collect([
['product' => 'Desk', 'price' => 200],
]);
$collection->sole();
// ['product' => 'Desk', 'price' => 200]
컬렉션에 sole 메서드로 반환되어야 하는 요소가 없으면 \Illuminate\Collections\ItemNotFoundException 예외가 발생합니다. 반환되어야 하는 요소가 둘 이상인 경우 \Illuminate\Collections\MultipleItemsFoundException가 발생합니다.
some() {.collection-method}
contains 메서드의 별칭입니다.
sort() {.collection-method}
sort 메서드는 컬렉션을 정렬합니다. 정렬된 컬렉션은 원래 배열 키를 유지하므로, 다음 예제에서는 values 메서드를 사용하여 키를 연속된 번호 인덱스로 재설정합니다:
$collection = collect([5, 3, 1, 2, 4]);
$sorted = $collection->sort();
$sorted->values()->all();
// [1, 2, 3, 4, 5]
정렬 요구 사항이 더 복잡한 경우, 자신의 알고리즘과 함께 sort에 콜백을 전달할 수 있습니다. 컬렉션의 sort 메서드가 내부적으로 사용하는 uasort에 대한 PHP 문서를 참조하세요.
[!NOTE] 중첩 배열이나 객체의 컬렉션을 정렬해야 하는 경우, sortBy 및 sortByDesc 메서드를 참조하세요.
sortBy() {.collection-method}
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],
]
*/
sortBy 메서드는 두 번째 인수로 정렬 플래그를 받습니다:
$collection = collect([
['title' => 'Item 1'],
['title' => 'Item 12'],
['title' => 'Item 3'],
]);
$sorted = $collection->sortBy('title', SORT_NATURAL);
$sorted->values()->all();
/*
[
['title' => 'Item 1'],
['title' => 'Item 3'],
['title' => 'Item 12'],
]
*/
또는 컬렉션의 값을 정렬하는 방법을 결정하기 위해 자신만의 클로저를 전달할 수 있습니다:
$collection = collect([
['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
['name' => 'Chair', 'colors' => ['Black']],
['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
]);
$sorted = $collection->sortBy(function (array $product, int $key) {
return count($product['colors']);
});
$sorted->values()->all();
/*
[
['name' => 'Chair', 'colors' => ['Black']],
['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
]
*/
컬렉션을 여러 속성으로 정렬하고 싶다면 sortBy 메서드에 정렬 작업 배열을 전달할 수 있습니다. 각 정렬 작업은 정렬하려는 속성과 원하는 정렬 방향으로 구성된 배열이어야 합니다:
$collection = collect([
['name' => 'Taylor Otwell', 'age' => 34],
['name' => 'Abigail Otwell', 'age' => 30],
['name' => 'Taylor Otwell', 'age' => 36],
['name' => 'Abigail Otwell', 'age' => 32],
]);
$sorted = $collection->sortBy([
['name', 'asc'],
['age', 'desc'],
]);
$sorted->values()->all();
/*
[
['name' => 'Abigail Otwell', 'age' => 32],
['name' => 'Abigail Otwell', 'age' => 30],
['name' => 'Taylor Otwell', 'age' => 36],
['name' => 'Taylor Otwell', 'age' => 34],
]
*/
컬렉션을 여러 속성으로 정렬할 때 각 정렬 작업을 정의하는 클로저를 제공할 수도 있습니다:
$collection = collect([
['name' => 'Taylor Otwell', 'age' => 34],
['name' => 'Abigail Otwell', 'age' => 30],
['name' => 'Taylor Otwell', 'age' => 36],
['name' => 'Abigail Otwell', 'age' => 32],
]);
$sorted = $collection->sortBy([
fn (array $a, array $b) => $a['name'] <=> $b['name'],
fn (array $a, array $b) => $b['age'] <=> $a['age'],
]);
$sorted->values()->all();
/*
[
['name' => 'Abigail Otwell', 'age' => 32],
['name' => 'Abigail Otwell', 'age' => 30],
['name' => 'Taylor Otwell', 'age' => 36],
['name' => 'Taylor Otwell', 'age' => 34],
]
*/
sortByDesc() {.collection-method}
이 메서드는 sortBy 메서드와 동일한 시그니처를 가지지만, 컬렉션을 반대 순서로 정렬합니다.
sortDesc() {.collection-method}
이 메서드는 sort 메서드와 반대 순서로 컬렉션을 정렬합니다:
$collection = collect([5, 3, 1, 2, 4]);
$sorted = $collection->sortDesc();
$sorted->values()->all();
// [5, 4, 3, 2, 1]
sort와 달리, sortDesc에는 클로저를 전달할 수 없습니다. 대신 sort 메서드를 사용하고 비교를 반전시켜야 합니다.
sortKeys() {.collection-method}
sortKeys 메서드는 기본 연관 배열의 키를 기준으로 컬렉션을 정렬합니다:
$collection = collect([
'id' => 22345,
'first' => 'John',
'last' => 'Doe',
]);
$sorted = $collection->sortKeys();
$sorted->all();
/*
[
'first' => 'John',
'id' => 22345,
'last' => 'Doe',
]
*/
sortKeysDesc() {.collection-method}
이 메서드는 sortKeys 메서드와 같은 시그니처를 가지지만, 컬렉션을 반대 순서로 정렬합니다.
sortKeysUsing() {.collection-method}
sortKeysUsing 메서드는 콜백을 사용하여 기본 연관 배열의 키를 기준으로 컬렉션을 정렬합니다:
$collection = collect([
'ID' => 22345,
'first' => 'John',
'last' => 'Doe',
]);
$sorted = $collection->sortKeysUsing('strnatcasecmp');
$sorted->all();
/*
[
'first' => 'John',
'ID' => 22345,
'last' => 'Doe',
]
*/
콜백은 0보다 작거나, 같거나, 크다는 정수를 반환하는 비교 함수여야 합니다. 자세한 내용은 PHP 문서에서 uksort를 참고하십시오. 이는 sortKeysUsing 메서드가 내부적으로 사용하는 PHP 함수입니다.
splice() {.collection-method}
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() {.collection-method}
split 방법은 컬렉션을 주어진 수의 그룹으로 나눕니다:
$collection = collect([1, 2, 3, 4, 5]);
$groups = $collection->split(3);
$groups->all();
// [[1, 2], [3, 4], [5]]
splitIn() {.collection-method}
splitIn 방법은 컬렉션을 주어진 수의 그룹으로 나누며, 마지막 그룹에 나머지를 할당하기 전에 비말 그룹을 완전히 채웁니다:
$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
$groups = $collection->splitIn(3);
$groups->all();
// [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]
sum() {.collection-method}
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 (array $product) {
return count($product['colors']);
});
// 6
take() {.collection-method}
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() {.collection-method}
takeUntil 메서드는 주어진 콜백이 true를 반환할 때까지 컬렉션의 항목을 반환합니다:
$collection = collect([1, 2, 3, 4]);
$subset = $collection->takeUntil(function (int $item) {
return $item >= 3;
});
$subset->all();
// [1, 2]
주어진 값이 발견될 때까지 항목을 가져오기 위해 간단한 값을 takeUntil 메서드에 전달할 수도 있습니다:
$collection = collect([1, 2, 3, 4]);
$subset = $collection->takeUntil(3);
$subset->all();
// [1, 2]
[!WARNING] 주어진 값이 발견되지 않거나 콜백이
true를 반환하지 않으면,takeUntil메서드는 컬렉션의 모든 항목을 반환합니다.
takeWhile() {.collection-method}
takeWhile 메서드는 주어진 콜백이 false를 반환할 때까지 컬렉션의 항목을 반환합니다:
$collection = collect([1, 2, 3, 4]);
$subset = $collection->takeWhile(function (int $item) {
return $item < 3;
});
$subset->all();
// [1, 2]
[!WARNING] 콜백이
false를 반환하지 않으면,takeWhile메서드는 컬렉션의 모든 항목을 반환합니다.
tap() {.collection-method}
tap 메서드는 컬렉션을 주어진 콜백에 전달하여 특정 시점에 컬렉션을 ‘탭’하고 항목들로 무언가를 수행할 수 있게 해주며, 컬렉션 자체에는 영향을 주지 않습니다. 그런 다음 컬렉션은 tap 메서드에 의해 반환됩니다:
collect([2, 4, 3, 1, 5])
->sort()
->tap(function (Collection $collection) {
Log::debug('Values after sorting', $collection->values()->all());
})
->shift();
// 1
times() {.collection-method}
정적 times 메서드는 주어진 클로저를 지정된 횟수만큼 호출하여 새로운 컬렉션을 생성합니다:
$collection = Collection::times(10, function (int $number) {
return $number * 9;
});
$collection->all();
// [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]
toArray() {.collection-method}
toArray 방법은 컬렉션을 일반 PHP array로 변환합니다. 컬렉션의 값이 Eloquent 모델인 경우, 모델 또한 배열로 변환됩니다:
$collection = collect(['name' => 'Desk', 'price' => 200]);
$collection->toArray();
/*
[
['name' => 'Desk', 'price' => 200],
]
*/
[!WARNING]
toArray는 컬렉션의 모든 중첩 객체 중Arrayable인스턴스를 배열로 변환하기도 합니다. 컬렉션의 기본 배열을 가져오고 싶다면 대신 all 메서드를 사용하세요.
toJson() {.collection-method}
toJson 메서드는 컬렉션을 JSON 직렬화된 문자열로 변환합니다:
$collection = collect(['name' => 'Desk', 'price' => 200]);
$collection->toJson();
// '{"name":"Desk", "price":200}'
toPrettyJson() {.collection-method}
toPrettyJson 메서드는 JSON_PRETTY_PRINT 옵션을 사용하여 컬렉션을 형식화된 JSON 문자열로 변환합니다:
$collection = collect(['name' => 'Desk', 'price' => 200]);
$collection->toPrettyJson();
transform() {.collection-method}
transform 메서드는 컬렉션을 반복하며 컬렉션의 각 항목으로 주어진 콜백을 호출합니다. 컬렉션의 항목들은 콜백이 반환한 값으로 대체됩니다:
$collection = collect([1, 2, 3, 4, 5]);
$collection->transform(function (int $item, int $key) {
return $item * 2;
});
$collection->all();
// [2, 4, 6, 8, 10]
[!WARNING] 대부분의 다른 컬렉션 메서드와 달리,
transform는 컬렉션 자체를 수정합니다. 대신 새로운 컬렉션을 생성하려면 map 메서드를 사용하세요.
undot() {.collection-method}
undot 메서드는 ‘점’ 표기법을 사용하는 1차원 컬렉션을 다차원 컬렉션으로 확장합니다:
$person = collect([
'name.first_name' => 'Marie',
'name.last_name' => 'Valentine',
'address.line_1' => '2992 Eagle Drive',
'address.line_2' => '',
'address.suburb' => 'Detroit',
'address.state' => 'MI',
'address.postcode' => '48219'
]);
$person = $person->undot();
$person->toArray();
/*
[
"name" => [
"first_name" => "Marie",
"last_name" => "Valentine",
],
"address" => [
"line_1" => "2992 Eagle Drive",
"line_2" => "",
"suburb" => "Detroit",
"state" => "MI",
"postcode" => "48219",
],
]
*/
union() {.collection-method}
union 메서드는 주어진 배열을 컬렉션에 추가합니다. 주어진 배열에 이미 원래 컬렉션에 있는 키가 포함되어 있는 경우, 원래 컬렉션의 값이 우선합니다:
$collection = collect([1 => ['a'], 2 => ['b']]);
$union = $collection->union([3 => ['c'], 1 => ['d']]);
$union->all();
// [1 => ['a'], 2 => ['b'], 3 => ['c']]
unique() {.collection-method}
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 메서드에 자신의 클로저를 전달할 수도 있습니다:
$unique = $collection->unique(function (array $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 메서드는 항목 값을 확인할 때 ‘느슨한(loose)’ 비교를 사용합니다. 이는 정수 값이 있는 문자열이 동일한 값의 정수와 같다고 간주됨을 의미합니다. ‘엄격(strict)’ 비교를 사용하여 필터링하려면 uniqueStrict 메서드를 사용하세요.
[!NOTE] 이 메서드의 동작은 Eloquent Collections를 사용할 때 수정됩니다.
uniqueStrict() {.collection-method}
이 메서드는 unique 메서드와 동일한 시그니처를 가지지만, 모든 값은 ‘엄격(strict)’ 비교를 사용하여 비교됩니다.
unless() {.collection-method}
unless 메서드는 메서드에 주어진 첫 번째 인수가 true로 평가되지 않는 한 주어진 콜백을 실행합니다. 콜렉션 인스턴스와 unless 메서드에 주어진 첫 번째 인수가 클로저에 제공됩니다:
$collection = collect([1, 2, 3]);
$collection->unless(true, function (Collection $collection, bool $value) {
return $collection->push(4);
});
$collection->unless(false, function (Collection $collection, bool $value) {
return $collection->push(5);
});
$collection->all();
// [1, 2, 3, 5]
두 번째 콜백은 unless 메서드에 전달될 수 있습니다. 두 번째 콜백은 unless 메서드에 제공된 첫 번째 인수가 true로 평가될 때 실행됩니다:
$collection = collect([1, 2, 3]);
$collection->unless(true, function (Collection $collection, bool $value) {
return $collection->push(4);
}, function (Collection $collection, bool $value) {
return $collection->push(5);
});
$collection->all();
// [1, 2, 3, 5]
unless의 역은 when 메서드를 참조하십시오.
unlessEmpty() {.collection-method}
whenNotEmpty 메서드의 별칭입니다.
unlessNotEmpty() {.collection-method}
whenEmpty 메서드의 별칭입니다.
unwrap() {.collection-method}
정적 unwrap 메서드는 해당 값에서 적용 가능한 경우 컬렉션의 기본 항목을 반환합니다:
Collection::unwrap(collect('John Doe'));
// ['John Doe']
Collection::unwrap(['John Doe']);
// ['John Doe']
Collection::unwrap('John Doe');
// 'John Doe'
value() {.collection-method}
value 메서드는 컬렉션의 첫 번째 요소에서 주어진 값을 가져옵니다:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Speaker', 'price' => 400],
]);
$value = $collection->value('price');
// 200
values() {.collection-method}
values 메서드는 키가 연속된 정수로 재설정된 새로운 컬렉션을 반환합니다:
$collection = collect([
10 => ['product' => 'Desk', 'price' => 200],
11 => ['product' => 'Speaker', 'price' => 400],
]);
$values = $collection->values();
$values->all();
/*
[
0 => ['product' => 'Desk', 'price' => 200],
1 => ['product' => 'Speaker', 'price' => 400],
]
*/
when() {.collection-method}
when 메서드는 메서드에 전달된 첫 번째 인수가 true로 평가될 때 주어진 콜백을 실행합니다. 컬렉션 인스턴스와 when 메서드에 전달된 첫 번째 인수는 클로저에 제공됩니다:
$collection = collect([1, 2, 3]);
$collection->when(true, function (Collection $collection, bool $value) {
return $collection->push(4);
});
$collection->when(false, function (Collection $collection, bool $value) {
return $collection->push(5);
});
$collection->all();
// [1, 2, 3, 4]
두 번째 콜백은 when 메서드에 전달될 수 있습니다. 두 번째 콜백은 when 메서드에 제공된 첫 번째 인수가 false로 평가될 때 실행됩니다:
$collection = collect([1, 2, 3]);
$collection->when(false, function (Collection $collection, bool $value) {
return $collection->push(4);
}, function (Collection $collection, bool $value) {
return $collection->push(5);
});
$collection->all();
// [1, 2, 3, 5]
when의 역을 원하면 unless 메서드를 참조하세요.
whenEmpty() {.collection-method}
whenEmpty 메서드는 컬렉션이 비어 있을 때 주어진 콜백을 실행합니다:
$collection = collect(['Michael', 'Tom']);
$collection->whenEmpty(function (Collection $collection) {
return $collection->push('Adam');
});
$collection->all();
// ['Michael', 'Tom']
$collection = collect();
$collection->whenEmpty(function (Collection $collection) {
return $collection->push('Adam');
});
$collection->all();
// ['Adam']
컬렉션이 비어 있지 않을 때 실행될 두 번째 클로저를 whenEmpty 메서드에 전달할 수 있습니다:
$collection = collect(['Michael', 'Tom']);
$collection->whenEmpty(function (Collection $collection) {
return $collection->push('Adam');
}, function (Collection $collection) {
return $collection->push('Taylor');
});
$collection->all();
// ['Michael', 'Tom', 'Taylor']
whenEmpty의 역변환은 whenNotEmpty 메서드를 참조하세요.
whenNotEmpty() {.collection-method}
whenNotEmpty 메서드는 컬렉션이 비어 있지 않을 때 주어진 콜백을 실행합니다:
$collection = collect(['Michael', 'Tom']);
$collection->whenNotEmpty(function (Collection $collection) {
return $collection->push('Adam');
});
$collection->all();
// ['Michael', 'Tom', 'Adam']
$collection = collect();
$collection->whenNotEmpty(function (Collection $collection) {
return $collection->push('Adam');
});
$collection->all();
// []
컬렉션이 비어 있을 때 실행될 두 번째 클로저를 whenNotEmpty 메서드에 전달할 수 있습니다:
$collection = collect();
$collection->whenNotEmpty(function (Collection $collection) {
return $collection->push('Adam');
}, function (Collection $collection) {
return $collection->push('Taylor');
});
$collection->all();
// ['Taylor']
whenNotEmpty의 역은 whenEmpty 메서드를 참조하세요.
where() {.collection-method}
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 메서드를 사용하고, null 값을 필터링하려면 whereNull 및 whereNotNull 메서드를 사용하세요.
선택적으로 두 번째 매개변수로 비교 연산자를 전달할 수 있습니다. 지원되는 연산자는 ‘===’, ‘!==’, ‘!=’, ‘==’, ‘=’, ‘<>’, ‘>’, ‘<’, ‘>=’, ‘<=’ 입니다.
$collection = collect([
['name' => 'Jim', 'platform' => 'Mac'],
['name' => 'Sally', 'platform' => 'Mac'],
['name' => 'Sue', 'platform' => 'Linux'],
]);
$filtered = $collection->where('platform', '!=', 'Linux');
$filtered->all();
/*
[
['name' => 'Jim', 'platform' => 'Mac'],
['name' => 'Sally', 'platform' => 'Mac'],
]
*/
whereStrict() {.collection-method}
이 메서드는 where 메서드와 동일한 시그니처를 가지지만, 모든 값은 “엄격한” 비교(strict comparison)를 사용하여 비교됩니다.
whereBetween() {.collection-method}
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() {.collection-method}
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 메서드는 항목 값을 확인할 때 “느슨한(loose)” 비교를 사용합니다. 즉, 정수 값이 있는 문자열은 동일한 값의 정수와 같다고 간주됩니다. “엄격(strict)” 비교를 사용하여 필터링하려면 whereInStrict 메서드를 사용하세요.
whereInStrict() {.collection-method}
이 메서드는 whereIn 메서드와 동일한 시그니처를 갖지만, 모든 값은 “엄격(strict)” 비교를 사용하여 비교됩니다.
whereInstanceOf() {.collection-method}
whereInstanceOf 메서드는 주어진 클래스 타입으로 컬렉션을 필터링합니다:
use App\Models\User;
use App\Models\Post;
$collection = collect([
new User,
new User,
new Post,
]);
$filtered = $collection->whereInstanceOf(User::class);
$filtered->all();
// [App\Models\User, App\Models\User]
whereNotBetween() {.collection-method}
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() {.collection-method}
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() {.collection-method}
이 메서드는 whereNotIn 메서드와 동일한 시그니처를 가지지만, 모든 값은 ‘엄격한’ 비교를 사용하여 비교됩니다.
whereNotNull() {.collection-method}
whereNotNull 메서드는 주어진 키가 null가 아닌 컬렉션의 항목을 반환합니다:
$collection = collect([
['name' => 'Desk'],
['name' => null],
['name' => 'Bookcase'],
['name' => 0],
['name' => ''],
]);
$filtered = $collection->whereNotNull('name');
$filtered->all();
/*
[
['name' => 'Desk'],
['name' => 'Bookcase'],
['name' => 0],
['name' => ''],
]
*/
whereNull() {.collection-method}
whereNull 메서드는 주어진 키가 null인 컬렉션의 항목을 반환합니다:
$collection = collect([
['name' => 'Desk'],
['name' => null],
['name' => 'Bookcase'],
['name' => 0],
['name' => ''],
]);
$filtered = $collection->whereNull('name');
$filtered->all();
/*
[
['name' => null],
]
*/
wrap() {.collection-method}
정적 wrap 메서드는 적용 가능한 경우 주어진 값을 컬렉션으로 감쌉니다:
use Illuminate\Support\Collection;
$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() {.collection-method}
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 고차 메시지를 사용해 보겠습니다:
use App\Models\User;
$users = User::where('votes', '>', 500)->get();
$users->each->markAsVip();
마찬가지로, 우리는 sum 고차 메시지를 사용하여 사용자 집합에 대한 총 ‘투표’ 수를 수집할 수 있습니다:
$users = User::where('group', 'Development')->get();
return $users->sum->votes;
게으른 컬렉션
소개
[!WARNING] Laravel의 게으른 컬렉션에 대해 더 배우기 전에 PHP 제너레이터에 익숙해지는 시간을 가지세요.
이미 강력한 Collection 클래스를 보완하기 위해, LazyCollection 클래스는 PHP의 제너레이터를 활용하여 메모리 사용량을 낮게 유지하면서 매우 큰 데이터셋을 처리할 수 있도록 합니다.
예를 들어, 애플리케이션이 멀티 기가바이트 로그 파일을 처리하면서 Laravel의 컬렉션 메서드를 사용해 로그를 파싱해야 한다고 가정해 봅시다. 파일 전체를 메모리에 한 번에 읽어들이는 대신, 게으른 컬렉션을 사용하면 특정 시점에 파일의 일부만 메모리에 유지할 수 있습니다:
use App\Models\LogEntry;
use Illuminate\Support\LazyCollection;
LazyCollection::make(function () {
$handle = fopen('log.txt', 'r');
while (($line = fgets($handle)) !== false) {
yield $line;
}
fclose($handle);
})->chunk(4)->map(function (array $lines) {
return LogEntry::fromLines($lines);
})->each(function (LogEntry $logEntry) {
// Process the log entry...
});
또는 10,000개의 Eloquent 모델을 반복 처리해야 한다고 상상해보세요. 전통적인 Laravel 컬렉션을 사용할 경우, 10,000개의 Eloquent 모델 모두를 한 번에 메모리에 로드해야 합니다:
use App\Models\User;
$users = User::all()->filter(function (User $user) {
return $user->id > 500;
});
그러나 쿼리 빌더의 cursor 메서드는 LazyCollection 인스턴스를 반환합니다. 이를 통해 여전히 데이터베이스에 대해 단일 쿼리만 실행할 수 있지만 동시에 메모리에는 하나의 Eloquent 모델만 유지할 수 있습니다. 이 예제에서 filter 콜백은 각 사용자를 개별적으로 반복(iterate)할 때까지 실행되지 않으므로 메모리 사용량을 크게 줄일 수 있습니다:
use App\Models\User;
$users = User::cursor()->filter(function (User $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;
}
fclose($handle);
});
열거 가능한 계약
Collection 클래스에서 사용할 수 있는 거의 모든 메서드는 LazyCollection 클래스에서도 사용할 수 있습니다. 이 두 클래스 모두 Illuminate\Support\Enumerable 계약을 구현하며, 이 계약은 다음 메서드를 정의합니다:
all average avg chunk chunkBy chunkWhile collapse collect combine concat contains containsStrict count countBy crossJoin dd diff diffAssoc diffKeys dump duplicates duplicatesStrict each eachSpread every except filter first firstOrFail firstWhere flatMap flatten flip forPage get groupBy has implode intersect intersectAssoc intersectByKeys isEmpty isNotEmpty join keyBy keys last macro make map mapInto mapSpread mapToGroups mapWithKeys max median merge mergeRecursive min mode nth only pad partition pipe pluck random reduce reduceInto reject replace replaceRecursive reverse search shuffle skip slice sole some sort sortBy sortByDesc sortKeys sortKeysDesc split sum take tap times toArray toJson union unique uniqueStrict unless unlessEmpty unlessNotEmpty unwrap values when whenEmpty whenNotEmpty where whereStrict whereBetween whereIn whereInStrict whereInstanceOf whereNotBetween whereNotIn whereNotInStrict wrap zip
[!WARNING] 컬렉션을 변경하는 메서드(
shift,pop,prepend등)는LazyCollection클래스에서 사용할 수 없습니다.
게으른 컬렉션 메서드
Enumerable 계약에 정의된 메서드 외에도, LazyCollection 클래스에는 다음과 같은 메서드가 포함되어 있습니다:
takeUntilTimeout() {.collection-method}
takeUntilTimeout 메서드는 지정된 시간까지 값을 열거하는 새로운 게으른 컬렉션을 반환합니다. 그 이후에는 컬렉션이 열거를 중단합니다:
$lazyCollection = LazyCollection::times(INF)
->takeUntilTimeout(now()->plus(minutes: 1));
$lazyCollection->each(function (int $number) {
dump($number);
sleep(1);
});
// 1
// 2
// ...
// 58
// 59
이 방법의 사용법을 설명하기 위해, 커서를 사용하여 데이터베이스에서 송장을 제출하는 애플리케이션을 상상해 보세요. 매 15분마다 실행되고 최대 14분 동안만 송장을 처리하는 예약 작업을 정의할 수 있습니다:
use App\Models\Invoice;
use Illuminate\Support\Carbon;
Invoice::pending()->cursor()
->takeUntilTimeout(
Carbon::createFromTimestamp(LARAVEL_START)->add(14, 'minutes')
)
->each(fn (Invoice $invoice) => $invoice->submit());
tapEach() {.collection-method}
each 메서드는 컬렉션의 각 항목에 대해 즉시 주어진 콜백을 호출하는 반면, tapEach 메서드는 항목이 하나씩 리스트에서 꺼내질 때마다 주어진 콜백을 호출합니다:
// Nothing has been dumped so far...
$lazyCollection = LazyCollection::times(INF)->tapEach(function (int $value) {
dump($value);
});
// Three items are dumped...
$array = $lazyCollection->take(3)->all();
// 1
// 2
// 3
throttle() {.collection-method}
throttle 메서드는 느린 수집을 제한하여 각 값이 지정된 초 수 후에 반환되도록 합니다. 이 메서드는 특히 들어오는 요청의 속도를 제한하는 외부 API와 상호작용할 때 유용합니다:
use App\Models\User;
User::where('vip', true)
->cursor()
->throttle(seconds: 1)
->each(function (User $user) {
// Call external API...
});
remember() {.collection-method}
remember 메서드는 이미 열거된 값을 기억하고 이후 컬렉션 열거 시 다시 가져오지 않는 새로운 지연(lazy) 컬렉션을 반환합니다:
// No query has been executed yet...
$users = User::cursor()->remember();
// The query is executed...
// The first 5 users are hydrated from the database...
$users->take(5)->all();
// First 5 users come from the collection's cache...
// The rest are hydrated from the database...
$users->take(20)->all();
withHeartbeat() {.collection-method}
withHeartbeat 메서드는 지연 컬렉션이 열거되는 동안 정기적인 시간 간격으로 콜백을 실행할 수 있게 해줍니다. 이는 잠금 연장이나 진행 상황 업데이트 전송과 같은 주기적인 유지보수 작업이 필요한 장시간 실행 작업에 특히 유용합니다:
use Carbon\CarbonInterval;
use Illuminate\Support\Facades\Cache;
$lock = Cache::lock('generate-reports', seconds: 60 * 5);
if ($lock->get()) {
try {
Report::where('status', 'pending')
->lazy()
->withHeartbeat(
CarbonInterval::minutes(4),
fn () => $lock->extend(CarbonInterval::minutes(5))
)
->each(fn ($report) => $report->process());
} finally {
$lock->release();
}
}