2009-12-08 6 views
0

배열을 정렬하는 데 어려움이 있습니다. 다음과 같이 보입니다 :PHP에서 테이블 정렬

[0] => Array 
     (
      [firstname] => Jnic 
      [lastname] => Fortin 
      [points] => Array 
       (
        [id] => 20453 
        [f] => 31 
        [r] => 7     
        [total] => 82 
       ) 

     ) 

    [1] => Array 
     (
      [firstname] => Kris 
      [lastname] => Anders 
      [points] => Array 
       (
        [id] => 20309      
        [f] => 0 
        [r] => 1 
        [total] => 56 
       ) 

     ) 
[2] => Array 
      (
       [firstname] => Em 
       [lastname] => Zajo 
       [points] => Array 
        (
         [id] => 20339      
         [f] => 8 
         [r] => 3 
         [total] => 254 
        ) 

      ) 

"total"DESC로 정렬하고 싶습니다. 내가 어떻게 할 수 있니? 모든 것이 정상적으로 정렬되면 배열은 [2] [0] [1] (254,82,56)

답변

4

일 것입니다. usort 함수를 사용할 수 있습니다. 콜백 함수를 사용하여 배열을 정렬합니다. 해당 배열의 요소 :이 함수는 사용자가 제공 비교 함수를 사용 그 값에 의해 배열을 정렬한다

bool usort (array &$array , callback $cmp_function ) 

. 당신이 원하는 배열이 필요 으로 분류 할 수 정렬 할 경우 기능이 $element['points']['total']별로 비교하기 위해 정의 된 경우 일부 비 사소한 기준, 당신은 이 트릭을 할해야이 기능을

를 사용해야합니다. 편집


: 여기 그리고는 usort과 동일 uasort를 사용하여 예이지만, ryanday 지적처럼, 배열의 키를 유지합니다 :

먼저,이 배열을 선언하자 :

$a = array(
    array(
     'firstname' => 'Jnic', 
     'lastname' => 'Fortin', 
     'points' => array(
      'id' => 20453, 
      'f' => 31, 
      'r' => 7, 
      'total' => 82, 
     ), 
    ), 
    array(
     'firstname' => 'Kris', 
     'lastname' => 'Anders', 
     'points' => array(
      'id' => 20309, 
      'f' => 0, 
      'r' => 1, 
      'total' => 56, 
     ), 
    ), 
    array(
     'firstname' => 'Em', 
     'lastname' => 'Zajo', 
     'points' => array(
      'id' => 20339, 
      'f' => 8, 
      'r' => 3, 
      'total' => 254, 
     ), 
    ), 
); 

그리고, 비교 함수 :

function my_compare($a, $b) { 
    if ($a['points']['total'] > $b['points']['total']) { 
     return -1; 
    } else if ($a['points']['total'] < $b['points']['total']) { 
     return 1; 
    } 
    return 0; 
} 
,174

uasort($a, 'my_compare'); 
var_dump($a); 

을 그리고 total 내림차순으로 정렬 된 배열을 얻을 :

그리고 마지막으로, 우리는 그것을 사용하는 당신의 답변을

array 
    2 => 
    array 
     'firstname' => string 'Em' (length=2) 
     'lastname' => string 'Zajo' (length=4) 
     'points' => 
     array 
      'id' => int 20339 
      'f' => int 8 
      'r' => int 3 
      'total' => int 254 
    0 => 
    array 
     'firstname' => string 'Jnic' (length=4) 
     'lastname' => string 'Fortin' (length=6) 
     'points' => 
     array 
      'id' => int 20453 
      'f' => int 31 
      'r' => int 7 
      'total' => int 82 
    1 => 
    array 
     'firstname' => string 'Kris' (length=4) 
     'lastname' => string 'Anders' (length=6) 
     'points' => 
     array 
      'id' => int 20309 
      'f' => int 0 
      'r' => int 1 
      'total' => int 56 


ryanday> 감사합니다!

0

만약 당신이 올바른 색인 배열이 중요하다면, uasort() 함수로 파스칼의 조언을 따르는 것이 중요하다는 것을 알게되었습니다.

function total_sort($a, $b){ 
    $a_total = $a['points']['total']; 
    $b_total = $b['points']['total']; 

    if($a_total == $b_total) return 0; 

    return ($a_total > $b_total) ? -1 : 1; 
} 

usort($array, "total_sort"); 

편집 :은 내가 @Pascal 그의 대답을 업데이트 보았다 게시 후

1

현재 @Pascal MARTIN 응답으로 usort를 사용하기를 원하지만 것이다 당신이 원하는 것을 달성하기 위해 전체 코드입니다 샘플을 포함합니다. 필자가 작성한 정렬 함수는 약간 씩 다르기 때문에 다른 참조로 남겨 두었습니다.

0

usort는 복잡한 경우에 매우 유연한 강력한 솔루션입니다.데이터 세트가 비교적 간단하기 때문에 나는 다음과 같은 제안 :

// assuming your array has been defined in $a 
$sort = array(); 
foreach ($a as $key => $suba) 
{ 
    // this collects the values you want to sort by and associates them with the correct index 
    $sort[$key] = $suba['points']['total']; 
} 
// this sorts the collected values 
sort($sort); 

// this re-sorts $a according to the sorted $sort array 
array_multisort($a, $sort); 

하지 않도록 성능에 대한하지만 적어도 좋은입니다에 usort하지 않을 경우 더 나은