2012-10-30 5 views
-2

어떻게 집은 빨강, 녹색, 파랑 분류되도록 다음과 같은 배열을 정렬 할 (조지 : 위치 0, 스티브 : 위치 [1], 프레드 : 위치 [2])?정렬 다차원 배열 PHP

Array 
(
    [catOne] => Array 
     (
      [0] => Array 
       (
        [Opponent] => Steve 
        [House_Colour] => Green 
       ) 

      [1] => Array 
       (
        [Opponent] => Fred 
        [House_Colour] => Blue 
       ) 

      [2] => Array 
       (
        [Opponent] => George 
        [House_Colour] => Red 
       ) 
     ) 

    [catTwo] => Array 
     (
      [0] => Array 
       (
        [Opponent] => Peter 
        [House Colour] => Green 
       ) 

     ) 

) 

sort(), asort() 및 usort()를 사용해 보았지만 필요한 것은 무엇입니까?

편집 : 정렬을 쉽게 변경할 수 있어야합니다. 그것은 하우스 컬러 (House Color)의 순서 일 수 있습니다. 사용 된 순서는 단지 예일뿐입니다.

+0

단지에 usort 누군가가 그것을 제안 후 당신이 필요로하지 않는 말을하지 마십시오. 값으로 배열을 정렬하는 데 사용할 수 있습니다. –

답변

1

, 당신은 usort를 사용할 수 있습니다

usort($array, function($a, $b) { 
    $sort = array('Red', 'Green', 'Blue'); 
    if (array_search($a['House_Colour'], $sort) > array_search($b['House_Colour'], $sort)) return 1; 
    if (array_search($a['House_Colour'], $sort) < array_search($b['House_Colour'], $sort)) return -1; 
    return 0; 
}); 

대신 집 솔루션이 straiforward됩니다 색상과 더 효율적으로하기위한 문자열에 의존에 정의에 활용 할 수 있습니다.

당신은 당신이 아닌 경우 상대 팀/선수에게

$opponent = array ('Opponent'=>'Steve', 'House_Colour'=>HouseColour::Green); 

을 선언해야이 경우

Class HouseColour { 
    const Red = 0; 
    const Green = 1; 
    const Blue = 2; 
} 

을 (열거 타입을 시뮬레이션) 정적 클래스의 하우스 색상을 정의한다 클래스와 정적 상수 편하지 당신이 정의의 순서에 의존 할 수 있습니다 (혜택은 정말 좋은이기 때문에 당신은 그들과 함께 편하지해야한다)

define ('HC_Red',0); 
define ('HC_Green', 1); 
define ('HC_Blue', 2); 

상대는 두 경우 모두

$opponent = array ('Opponent'=>'Steve', 'House_Colour'=>HC_Green); 

를해진다에 usort 기능은 동일입니다

usort($array, function($a, $b) { 
    if ($a['House_Colour'] > $b['House_Colour']) return 1; 
    if ($a['House_Colour'] < $b['House_Colour']) return -1; 
    return 0; 
}); 
2

당신은 usort을 시도 할 수 있습니다. 사용자 정의 콜백 함수를 지정하는 배열을 정렬 할 수 있습니다. 당신이 당신의 항목을 분류하기를 원하는 기준으로 명확히 진술하지 않았기 때문에 나는 그 기능에 관해 당신을 정말로 도울 수 없다. (내 추측은 House_Colour부터 Red > Green > Blue까지 역순으로 바뀌었지만 간과 한 다른 기준이 없는지 잘 모르겠습니다.)

이 간단한 비교 기능은 항목을 지정한 순서대로 집 색상별로 정렬하고 수정하기 쉽습니다 당신이 정말로 원하는 것. 각 색상은 당신이 (당신이 쉽게 새로운 색상을 추가 할 수 있습니다) 자기를 할당 할 수 있습니다 순위를 가지고, 또한 당신은 else if 부분에서 비교 연산자를 틀지 쉽게 순서를 변경할 수 있습니다.

function cmp($a, $b) { 
    $colors = Array('RED' => 3, 'GREEN' => 2, 'BLUE' => 1); 
    // A is ranked same as B 
    if ($colors[$a['House_Colour']] == $colors[$b['House_Colour']]) { 
     return 0; 
    } 
    // A is ranked above B 
    else if ($colors[$a['House_Colour']] > $colors[$b['House_Colour']]) { 
     return 1; 
    } 
    // A is ranked below B 
    else { 
     return -1; 
    } 
} 

실행중인 예 here을 볼 수 있습니다. 당신이해야 할 일을 이해한다면

+0

나는 usort를 시도했지만 기능의 논리에는 운이 없었습니다. 정렬은 쉽게 변경할 수 있어야합니다. 그것은 하우스 컬러 (House Color)의 순서 일 수 있습니다. 사용 된 순서는 단지 예일뿐입니다. – user826855

+0

글쎄'usort' 도전적으로 당신이 가고 싶은 방법입니다, 당신이 사용자 정의 함수로 배열을 정렬 할 수있는 유일한 방법입니다. 정렬 기준이 아무도 당신에게 적절한 방법을 말할 수 없을 것이라고 분명하게 말하지 않으면, 우리는 프로그래머이며 독자는 신경 쓸 필요가 없습니다. – clentfort