2013-08-26 4 views
2

IOC 컨테이너를 통해 액세스 할 수있는 "게시"개체가 있습니다. 다양한 에러는이 객체의 유형이 IteratorAggregate 및 ArrayAccess를 비롯한 여러 인터페이스를 구현하는 "Collection"으로 끝난다는 것을 알려줍니다.PHP Iterator 사용자 지정 정렬 순서 (Laravel 4)

나는 그냥 이런 방식으로 배열을 정렬

$desired=array("69","63","70");//these represent post id's 

복잡한 것 : 특정 순서에 따라 게시물의 사용자 정의 그룹을 표시 예 : 원하는,하지만 난 내 컬렉션을 정렬 할 수 있습니다. 나는 usort(), uksort(), Eloquent의 sortBy(), array_multisort() 등의 다양한 조합을 연구 해왔다. 그러나 가장 명백한 솔루션은 3,2,1 또는 1,2,3과 같은 명령을 내린다. 1,3.

나는이 목표에 입수했습니다 가장 가까운 내가 원하는 사람을 가져올 것입니다

,

//BlogController 
private function myposts($desired){ 
    $posts=$this->post->whereIn('id',$desired)->get(); 
    ... 

, 배열에

$posts=$posts->toArray(); 

을 Collection 객체를 "변환"와 함께 배열을 치료 맞춤 함수 : source

function sortArrayByArray($array,$orderArray) { 
    $ordered = array(); 
    foreach($orderArray as $key) { 
     if(array_key_exists($key,$array)) { 
      $ordered[$key] = $array[$key]; 
      unset($array[$key]); 
     } 
    } 
    return $ordered + $array; 
} 
$sorted=sortArrayByArray($array1,$desired); 

다음으로 corr의 배열을 vardump 할 수 있습니다. ect 명령을 사용하지만 배열이므로 이제는 $보기 개체에 액세스 할 수 없습니다. 배열을 다시 게시 객체로 변환 할 수 있습니까?

어쨌든이 전체적인 접근 방식은 배열로 변환하고 뒤로 ... 그것은 무엇입니까? "콜렉션"의 내용을 정렬하는 더 간단한 방법이 있습니까? 이 조금 더

, 아마도 (네이티브 PHP 함수) : 다시 말하지만,이 배열 작동

array_multisort($desired,$posts,SORT_STRING); 
//only works with string keys 
//$desire=(1,2,3) will not work! 

하지만 "게시물"개체가 실패에 직접 시도 ...

마지막으로 컨트롤러에 완료 위의 한 후보기에서 작동 https://github.com/robclancy/presenter#array-usage, :, 나는 발표자를 사용하여 발견

@foreach($posts as $post) 
<?php $post=new PostPresenter($post) ?> 
{{View::make('site.post.article')->with(compact('post'))}} 
@endforeach 

이 마지막으로 작동하지만, 여전히 요금 먼 길을 좋아합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 한 가지 방법과 다른 방법에 대한 성능 문제 또는 모범 사례? 도움을 줄 수있는 사람에게 미리 감사드립니다.

답변

2

컬렉션을 소유하고 sort 메서드를 사용하고 콜백을 전달할 수 있습니다. 콜백은 콜렉션의 두 값이 모두 "더 높은"정렬 방법을 알려주는 것을 비교합니다. 그런 다음 정렬 방법에 따라 정렬됩니다. 특정 값의 순서를 원한다면 매핑을 생성하고 정렬하십시오. 추가 정보를 원하시면 @으로 또는 팀의 답변을 uasort

$posts->sort(function($a, $b){ 
    $desired=array("69" => 0,"63" => 1,"70" =>2); 
    if(!array_key_exists($a,$desired) || !array_key_exists($b,$desired) || $a == $b){ 
     return 0 
    } 
    else{ 
     return ($desired[$a] < $desired[$b]) ? -1 : 1; 
    } 
}); 
+0

난거야이 방법을 시도하지만, 내가해야 클로저 외부에서 use()를 사용하여 "custom order"를 가져 오십시오. –

1

을 확인, 당신은 새로운 컬렉션 객체에 정렬 된 배열을 다시 할당 할 수 있습니다

$postsArray = $this->posts->toArray(); 

// Do some sorting/processing, then: 

$newCollection = new \Illuminate\Database\Eloquent\Collection($postsArray); 
+0

이것을 시도한 다음 $ postsArray를 반복하고 $ post-> name 또는 컬렉션 항목의 속성을 참조하려고 할 때 오류가 발생합니다. '비 객체 속성 가져 오기' – phirschybar