2014-12-31 3 views
0

나는 다음과 같은 필터 코드를 가지고 :Laravel Collection에서 필터링 된 항목을 주문하는 방법이 있습니까?

$cards->filter(function($card) { 
    if(str_contains($card->text, 'white') || str_contains($card->text, 'blue') || str_contains($card->text, 'black') || str_contains($card->text, 'red') || str_contains($card->text, 'green')) { 
     return true; 
    } 
}); 
나는 녹색, 빨강, 흰색, 파란색, 검은 색의 순서로 내 결과를 얻을 싶습니다

. 결과가 순서대로되도록하려면 어떻게해야합니까?

샘플 카드 데이터 :

stdClass Object 
(
    [text] => Flowers are white. 
) 
+0

'strpos'은'리턴 0' 문자열은 건초 더미의 시작 부분에있는 경우. 위증하여,'filter'가 그들을 걸러냅니다. –

+0

이 필터는 정상적으로 작동합니다. 순서 만 바꿔야합니다. – rotaercz

+0

오, 나는 당신이 말한 것을 다시 읽었습니다. 대신에 당신은 무엇을 제안합니까? – rotaercz

답변

3
$colors = ['white', 'blue', 'black', 'red', 'green']; 

$cards = $cards->filter(function($card) use ($colors) 
{ 
    return str_contains($card->text, $colors); 
}) 
->sortBy(function($card) use ($colors) 
{ 
    foreach ($colors as $index => $color) 
    { 
     if (str_contains($card->text, $color)) 
     { 
      return $index; 
     } 
    } 
}) 
->values(); 
+0

내가 아는 한'str_contains'는 바늘의 배열을 취하므로'str_contains ($ card-> text, $ order)를 반환하도록'단축 할 수 있습니다. – lukasgeiter

+0

@JosephSilber : 놀랍습니다. – rotaercz

+0

@JosephSilber : 색상별로 정렬하기 전에 문자열 길이별로 정렬하는 방법이 있습니까? – rotaercz

관련 문제