수색…
통사론
- $ collection = collect ([ 'Value1', 'Value2', 'Value3']); // 키는 기본적으로 0, 1, 2, ...,
비고
Illuminate\Support\Collection
은 데이터 배열을 처리하기위한 유창하고 편리한 인터페이스를 제공합니다. 예를 들어 여러 레코드를 가져 오는 모델 쿼리는 Illuminate\Support\Collection
의 인스턴스를 반환합니다.
컬렉션에 대한 최신 문서는 공식 문서를 찾을 수 있습니다.
컬렉션 만들기
collect()
도우미를 사용하면 다음과 같은 배열을 전달하여 새 컬렉션 인스턴스를 쉽게 만들 수 있습니다.
$fruits = collect(['oranges', 'peaches', 'pears']);
도우미 함수를 사용하지 않으려면 클래스를 직접 사용하여 새 Collection을 만들 수 있습니다.
$fruits = new Illuminate\Support\Collection(['oranges', 'peaches', 'pears']);
설명에서 언급했듯이 모델은 기본적으로 Collection
인스턴스를 반환하지만 필요에 따라 자신 만의 컬렉션을 만들 수 있습니다. 작성시에 배열이 지정되어 있지 않은 경우, 빈 상태 (empty)의 Collection가 작성됩니다.
어디에()
where()
메서드를 사용하여 컬렉션에서 특정 항목을 선택할 수 있습니다.
$data = [
['name' => 'Taylor', 'coffee_drinker' => true],
['name' => 'Matt', 'coffee_drinker' => true]
];
$matt = collect($data)->where('name', 'Matt');
이 코드는 컬렉션에서 이름이 '매트'인 모든 항목을 선택합니다. 이 경우 두 번째 항목 만 반환됩니다.
중첩
Laravel의 대부분의 배열 메소드와 마찬가지로, where()
는 중첩 된 요소 검색을 지원합니다. 위의 예제를 두 번째 배열을 추가하여 확장 해 보겠습니다.
$data = [
['name' => 'Taylor', 'coffee_drinker' => ['at_work' => true, 'at_home' => true]],
['name' => 'Matt', 'coffee_drinker' => ['at_work' => true, 'at_home' => false]]
];
$coffeeDrinkerAtHome = collect($data)->where('coffee_drinker.at_home', true);
그는 집에서 커피를 마실 때만 테일러를 돌려 보낼 것입니다. 보시다시피 중첩은 점 표기법을 사용하여 지원됩니다.
추가
배열 대신 객체 컬렉션을 만들 때 where()
를 사용하여 객체를 필터링 할 수 있습니다. 그런 다음 컬렉션은 원하는 모든 속성을 수신하려고 시도합니다.
Laravel 5.3 이후 where()
메서드는 기본적으로 값을 느슨하게 비교하려고 시도합니다. 즉 (int)1
검색하면 '1'
을 포함하는 모든 항목도 반환됩니다. 해당 동작이 마음에 들지 않으면 whereStrict()
메서드를 사용할 수 있습니다.
조회 값으로 가져 오기 또는 기본값 반환
상응하는 가치를 찾아야하는 상황에 처한 경우가 종종 있습니다.
아래 예제에서 배열에 3 개의 다른 로케일이 있으며 해당 호출 코드가 할당되어 있습니다. 우리는 로케일을 제공 할 수 있기를 원하며 그 대신에 관련된 호출 코드를 얻고 싶습니다. 첫 번째 매개 변수가 없으면 get
의 두 번째 매개 변수가 기본 매개 변수입니다.
function lookupCallingCode($locale)
{
return collect([
'de_DE' => 49,
'en_GB' => 44,
'en_US' => 1,
])->get($locale, 44);
}
위의 예제에서 우리는 다음을 할 수있다.
lookupCallingCode('de_DE'); // Will return 49
lookupCallingCode('sv_SE'); // Will return 44
콜백을 기본값으로 전달할 수도 있습니다. 지정된 키가 존재하지 않으면 콜백 결과가 반환됩니다.
return collect([
'de_DE' => 49,
'en_GB' => 44,
'en_US' => 1,
])->get($locale, function() {
return 44;
});
포함을 사용하여 컬렉션이 특정 조건을 만족하는지 확인
일반적인 문제는 모든 항목이 특정 기준을 충족해야한다는 것입니다. 아래의 예에서 우리는 다이어트 계획을 위해 두 가지 항목을 수집했으며, 다이어트에 건강에 해로운 음식이 들어 있지 않은지 확인하고자합니다.
// First we create a collection
$diet = collect([
['name' => 'Banana', 'calories' => '89'],
['name' => 'Chocolate', 'calories' => '546']
]);
// Then we check the collection for items with more than 100 calories
$isUnhealthy = $diet->contains(function ($i, $snack) {
return $snack["calories"] >= 100;
});
위의 경우에 $isUnhealthy
변수는 Chocolate이 조건을 충족 $isUnhealthy
따라 true
로 설정되므로 다이어트가 건강에 좋지 않습니다.
추출을 사용하여 컬렉션에서 특정 값 추출
데이터의 일부에만 관심이있는 데이터 모음을 자주 찾을 수 있습니다.
아래 예에서 우리는 이벤트 참가자 목록을 얻었고 투어 가이드에게 간단한 이름 목록을 제공하려고합니다.
// First we collect the participants
$participants = collect([
['name' => 'John', 'age' => 55],
['name' => 'Melissa', 'age' => 18],
['name' => 'Bob', 'age' => 43],
['name' => 'Sara', 'age' => 18],
]);
// Then we ask the collection to fetch all the names
$namesList = $partcipants->pluck('name')
// ['John', 'Melissa', 'Bob', 'Sara'];
도트 표기법을 사용하여 객체 콜렉션 또는 중첩 된 배열 / 객체에 대해 pluck
을 사용할 수도 있습니다.
$users = User::all(); // Returns Eloquent Collection of all users
$usernames = $users->pluck('username'); // Collection contains only user names
$users->load('profile'); // Load a relationship for all models in collection
// Using dot notation, we can traverse nested properties
$names = $users->pluck('profile.first_name'); // Get all first names from all user profiles
지도를 사용하여 컬렉션의 각 요소를 조작합니다.
종종 일련의 데이터가 구조화되고 특정 값을 조작하는 방식을 변경해야합니다.
아래 예에서 우리는 할인 금액이 첨부 된 책자를 확보했습니다. 그러나 우리는 오히려 이미 할인 된 가격의 책 목록을 가지고 있습니다.
$books = [
['title' => 'The Pragmatic Programmer', 'price' => 20, 'discount' => 0.5],
['title' => 'Continuous Delivery', 'price' => 25, 'discount' => 0.1],
['title' => 'The Clean Coder', 'price' => 10, 'discount' => 0.75],
];
$discountedItems = collect($books)->map(function ($book) {
return ['title' => $book["title"], 'price' => $book["price"] * $book["discount"]];
});
//[
// ['title' => 'The Pragmatic Programmer', 'price' => 10],
// ['title' => 'Continuous Delivery', 'price' => 12.5],
// ['title' => 'The Clean Coder', 'price' => 5],
//]
이것은 또한, 키를 변경의 우리가 키 변경을 원 가정 해 봅시다하는 데 사용할 수 있습니다 title
하는 name
에 적합한 솔루션이 될 것입니다이.
통계 계산을 위해 컬렉션에서 sum, avg, min 또는 max 사용
컬렉션은 또한 간단한 통계 계산을 쉽게 할 수있는 방법을 제공합니다.
$books = [
['title' => 'The Pragmatic Programmer', 'price' => 20],
['title' => 'Continuous Delivery', 'price' => 30],
['title' => 'The Clean Coder', 'price' => 10],
]
$min = collect($books)->min('price'); // 10
$max = collect($books)->max('price'); // 30
$avg = collect($books)->avg('price'); // 20
$sum = collect($books)->sum('price'); // 60
컬렉션 정렬하기
컬렉션을 정렬하는 몇 가지 다른 방법이 있습니다.
종류()
sort
메소드는 콜렉션을 정렬합니다.
$collection = collect([5, 3, 1, 2, 4]);
$sorted = $collection->sort();
echo $sorted->values()->all();
returns : [1, 2, 3, 4, 5]
또한 sort
메소드를 사용하면 사용자 정의 알고리즘을 사용하여 사용자 정의 콜백을 전달할 수 있습니다. 후드는 php의 usort
합니다.
$collection = $collection->sort(function ($a, $b) {
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
});
SortBy ()
sortBy
메서드는 지정된 키를 기준으로 컬렉션을 정렬합니다.
$collection = collect([
['name' => 'Desk', 'price' => 200],
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
]);
$sorted = $collection->sortBy('price');
echo $sorted->values()->all();
returns: [
['name' => 'Chair', 'price' => 100],
['name' => 'Bookcase', 'price' => 150],
['name' => 'Desk', 'price' => 200],
]
sortBy
메서드를 사용하면 다차원 배열을 정렬하기 위해 점 표기 형식을 사용하여 더 깊은 키에 액세스 할 수 있습니다.
$collection = collect([
["id"=>1,"product"=>['name' => 'Desk', 'price' => 200]],
["id"=>2, "product"=>['name' => 'Chair', 'price' => 100]],
["id"=>3, "product"=>['name' => 'Bookcase', 'price' => 150]],
]);
$sorted = $collection->sortBy("product.price")->toArray();
return: [
["id"=>2, "product"=>['name' => 'Chair', 'price' => 100]],
["id"=>3, "product"=>['name' => 'Bookcase', 'price' => 150]],
["id"=>1,"product"=>['name' => 'Desk', 'price' => 200]],
]
SortByDesc ()
이 메소드는 sortBy
메소드와 동일한 서명을 갖지만 반대 순서로 콜렉션을 정렬합니다.
reduce () 사용하기
reduce
메소드는 컬렉션을 단일 값으로 줄이고 각 반복의 결과를 후속 반복에 전달합니다. reduce 메소드를 참조하십시오.
reduce
메소드는 컬렉션을 사용하여 각 항목을 반복하고 다음 반복에 대한 새 결과를 생성합니다. 마지막 반복의 각 결과는 첫 번째 매개 변수를 통해 전달됩니다 (다음 예제에서는 $carry
와 $carry
).
이 방법은 대형 데이터 세트에서 많은 처리를 수행 할 수 있습니다. 예를 들어 다음 예제에서는 학생 데이터 예제를 사용합니다.
$student = [
['class' => 'Math', 'score' => 60],
['class' => 'English', 'score' => 61],
['class' => 'Chemistry', 'score' => 50],
['class' => 'Physics', 'score' => 49],
];
합계 학생의 총점
$sum = collect($student)
->reduce(function($carry, $item){
return $carry + $item["score"];
}, 0);
결과 : 220
설명:
-
$carry
는 마지막 반복의 결과입니다. - 두 번째 매개 변수는 첫 번째 반복 라운드에서 $ carry의 기본값입니다. 이 경우 기본값은 0입니다.
모든 점수가 50 점 이상인 학생을 합격합니다.
$isPass = collect($student)
->reduce(function($carry, $item){
return $carry && $item["score"] >= 50;
}, true);
결과 : false
설명:
- $ carry의 기본값은 true입니다.
- 모든 점수가 50보다 크면 결과는 true를 반환합니다. 50보다 작 으면 false를 반환합니다.
점수가 50 점 미만이면 학생을 낙제하십시오.
$isFail = collect($student)
->reduce(function($carry, $item){
return $carry || $item["score"] < 50;
}, false);
결과 : true
설명:
- $ carry의 기본값은 false입니다.
- 점수가 50보다 작 으면 true를 반환하고 그렇지 않으면 false를 반환합니다. 모든 점수가 50보다 크면 false를 반환합니다.
가장 높은 점수를 얻은 피사체를 반환합니다.
$highestSubject = collect($student)
->reduce(function($carry, $item){
return $carry === null || $item["score"] > $carry["score"] ? $item : $carry;
});
결과 : [ "subject" => "English", "score" => 61 ]
설명:
두 번째 매개 변수는이 경우 제공되지 않습니다.
$ carry의 기본값은 null이므로 우리는 조건부로 그 값을 확인합니다.
매크로 ()를 사용하여 콜렉션 확장하기
macro()
함수를 사용하면 Illuminate\Support\Collection
객체에 새 기능을 추가 할 수 있습니다.
용법:
Collection::macro("macro_name", function ($parameters) {
// Your macro
});
예 :
Collection::macro('uppercase', function () {
return $this->map(function ($item) {
return strtoupper($item);
});
});
collect(["hello", "world"])->uppercase();
결과 : ["HELLO", "WORLD"]
배열 구문 사용
Collection
객체는 ArrayAccess
및 IteratorAggregate
인터페이스를 구현하여 배열처럼 사용할 수 있도록합니다.
액세스 수집 요소 :
$collection = collect([1, 2, 3]);
$result = $collection[1];
결과 : 2
새 요소 할당 :
$collection = collect([1, 2, 3]);
$collection[] = 4;
결과 : $collection
은 [1, 2, 3, 4]
루프 모음 :
$collection = collect(["a" => "one", "b" => "two"]);
$result = "";
foreach($collection as $key => $value){
$result .= "(".$key.": ".$value.") ";
}
결과 : $result
는 (a: one) (b: two)
배열을 컬렉션으로 변환 :
콜렉션을 기본 PHP 배열로 변환하려면 다음을 사용하십시오.
$array = $collection->all();
//or
$array = $collection->toArray()
배열을 콜렉션으로 변환하려면 다음을 사용하십시오.
$collection = collect($array);
배열 함수를 사용하여 컬렉션 사용
콜렉션은 array_map($callback)
과 같이 명시 적으로 배열을 필요로하는 함수가 사용할 때 콜렉션이 정상적으로 변환되지 않는다는 사실을 명심하십시오.
콜렉션을 먼저 변환하거나, 가능하다면 Collection
클래스가 제공하는 메소드를 사용하십시오 : $collection->map($callback)