2011-12-28 2 views
1

north, east, south 또는 west 값이 포함 된 배열이 있습니다.배열을 usort로 정렬

예를 들어 남쪽, 서쪽 및 북쪽 순서로 값이있는 배열이 있습니다.

이제 north, east, south 및 west와 같은 배열을 정렬하고 싶습니다.

내 예에서 값은 북쪽, 남쪽, 서쪽의 순서 여야합니다.

어떻게하면됩니까?

감사합니다.

+0

지금까지 수행 한 코드를 추가하십시오. 그것은 배열의 정의 일뿐입니다. 그리고 아마도 당신은 문제가 더 잘 붙어있는 지점을 강조 할 수 있습니다. – hakre

+0

종종 [배열 정렬 기능 비교] (http://www.php.net/manual/en/array.sorting.php)가 매우 유용합니다. – hakre

+0

조금 더 자세하게 설명해 주시겠습니까? 왜 이런 방식으로 정렬 하시겠습니까? 너 뭐하려고? 지금은 왜 내가 포함해야 할 항목을 이미 알고 있기 때문에 원하는 방식으로 정렬 된 배열을 만들지 않는 이유는 알 수 없습니다. –

답변

6

array_intersect()을 사용할 수도 있습니다. 첫 번째 배열의 순서를 유지합니다. 올바른 순서로 모든 기본 경로의 배열을 첫 번째 매개 변수로, 배열을 두 번째 매개 변수로 정렬하십시오.

$cardinals = array('north', 'east', 'south', 'west'); 
$input = array('south', 'west', 'north'); 

print_r(array_intersect($cardinals, $input)); 
+0

감사합니다. 작동합니다! – Jordy

+0

흥미 롭습니다. 적어도 3 가지를 좋아합니다. 간결하지만 * 매우 명확하고 콜백을 사용하지 않으며 콜백 솔루션으로 확장 할 수 있어야합니다 (북동 등을 추가해야하는 경우). 산뜻한! – zrvan

+0

예, 매우 깔끔합니다. 키별로 정렬해야하는 경우 [array_intersect_key'] (http://php.net/array_intersect_key)도 있습니다. – hakre

0

당신이의 라인을 따라 뭔가를 (나는 그것이 사무엘 로페즈는 코멘트에 제안되어 무엇을 생각) 할 수있는 :

$arr = array ('north', 'west', 'south', 'east',); 

function compass_sort ($a, $b) 
{ 
     $cmptable = array_flip (array (
       'north', 
       /* you might want to add 'northeast' here*/ 
       'east', 
       /* and 'southeast' here */ 
       'south', 
       'west', 
     )); 

     $v1 = trim (mb_strtolower ($a)); 
     $v2 = trim (mb_strtolower ($b)); 

     if (! isset ($cmptable[$v1]) 
      || ! isset ($cmptable[$v2])) 
     { 
       /* error, no such direction */ 
     } 

     return $cmptable[$v1] > $cmptable[$v2]; 
} 

usort ($arr, 'compass_sort'); 

이 그 수에 각 방향 및 종류에 번호를 할당 , north에는 0이 할당되고, east은 하나가됩니다 (중간에 무언가를 추가하지 않는 한).