수색…


통사론

  • $ 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() 를 사용하여 객체를 필터링 할 수 있습니다. 그런 다음 컬렉션은 원하는 모든 속성을 수신하려고 시도합니다.

5.3

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 객체는 ArrayAccessIteratorAggregate 인터페이스를 구현하여 배열처럼 사용할 수 있도록합니다.

액세스 수집 요소 :

 $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)



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow