2010-08-11 2 views
5

넥타이가있을 때 배열의 숫자 값에 랭크를 지정하려고 할 때 어디에서 시작해야하는지 알기가 힘듭니다. 같은 다른 배열로넥타이가있을 때 배열에 랭크 번호를 할당하는 방법

myarray = (4,76,34,13,34) 

: 그래서, 예를 들어, 나는 다음과 같은 배열을 설정해야 같은 수의 배열에 두 번 이상 발생하면 기본적으로

myarray2 = (1,5,3.5,2,3.5) 

, 할당 그 숫자에 대한 순위는 순위의 평균입니다. 그래서 34 명 중 34 명은 3 명과 4 명으로 분류되는 대신 둘 다 3.5 명으로 할당됩니다. 마찬가지로, 34의 사본이 3 개 있다면 3 개의 할당 된 등급이 3으로 나뉩니다. 어떤 도움이라도 대단히 감사하겠습니다!

많은 감사,

아담

+1

그리고 특정을 찾을 수없는 배열의 두 가지 형식 사이의 체계. – Sarfraz

+0

더 설명 할 수 있습니까? – shox

+0

그것은 매우 특별한 방법으로 동점을 처리합니다. –

답변

2

나는 이걸로 재미 있었어!

function rank($input) 
{ 
    $output = array(); 
    $ranking = $input; sort($ranking); $ranking = array_flip($ranking); 
    $last_val = -1; 
    foreach($ranking as $key => $val){ 
    $repetitions = ($val-$last_val-1); 
    $last_val = $val; 
    if($repetitions) {  
     $ranking[$key] = (($val*($repetitions+1))-($repetitions+1)*(($repetitions)/2))/($repetitions+1)+1 ; 
    } else { 
     $ranking[$key] = $val+1; 
    } 
    } 
    foreach($input as $key => $val){ 
    $output[$key] = $ranking[$val]; 
    } 
    return $output; 
} 

이처럼 사용

$a = array(4,76,34,13,34);  
$c = rank($a); 
print_r($c); 

가 출력 :

Array 
(
    [0] => 1 
    [1] => 5 
    [2] => 3.5 
    [3] => 2 
    [4] => 3.5 
) 

느릅 나무가 동일 같이

Array(1, 5, 3.5, 2, 3.5) 

예상대로!

function Rank($data) { 
    $count = 0; 
    $unique = $data; sort($unique); 
    $unique = array_count_values($unique); 

    foreach ($unique as $key => $frequency) { 
     foreach (range(1, $frequency) as $i) { 
      $unique[$key] += $count++; 
     } 

     $unique[$key] /= $frequency; 
    } 

    foreach ($data as $key => $value) { 
     $data[$key] = $unique[$value]; 
    } 

    return $data; 
} 

예 (demo) :

1

나는 당신을 가정도 같은 순위에 묶여 서너 또는 N 값이있는 경우를 처리 할 필요가있다.

나는 어떤 PHP 전문가는 아니지만, 여기에 접근 (의사 코드) 순위 함수를 정의에의 :

define a = original array 
define s = a.Sorted 
define rank(n) = (s.FirstIndexOf(n) + s.LastIndexOf(n))/2 

당신이도를 위해 작동 자신을 설득하기 위해 종이에 몇 가지 예를 작동해야 할 수도 있습니다 3 배 이상; 중복이 인접하도록 s에 의존합니다.

+1

s의 값을 입력 배열의 순서로 다시 가져 오는 방법은 무엇입니까? – aaronasterling

+0

's'을 순서대로 되돌려 놓지 않아도됩니다. 어쨌든 할 수는 없습니다. 'a'는 원래의 순서대로 원래 배열입니다. 's'는 * copy *입니다. – Bevan

+0

이 배열을 0 또는 1 인덱스 기반으로 가정합니까? – Tom

2

여기 한 가지 방법이 있습니다.

<?php 
$myarray  = array(4,76,34,13,34); 

$sorted_array = $myarray; 
$grouped_array = array(); 
sort($sorted_array); 
foreach ($sorted_array as $rank => $entry) { 
    // Initialize the entry if it doesn't already exist 
    if (empty($grouped_array[$entry])) { 
     $grouped_array[$entry]['count'] = 1.0; 
     $grouped_array[$entry]['total'] = $rank + 1; // Account for 0-based array 
    } else { 
     $grouped_array[$entry]['count'] += 1.0; 
     $grouped_array[$entry]['total'] += $rank + 1; // Account for 0-based array 
    } 
} 
$myarray2 = array(); 
foreach ($myarray as $entry) { 
    // Get the average 
    $myarray2[] = $grouped_array[$entry]['total']/$grouped_array[$entry]['count']; 
} 
0

허용되는 솔루션 (너무 다른) 그들이해야보다 훨씬 더 복잡한 것 같다

print_r(Rank(array(4, 76, 34, 13, 34))); // 1; 5; 3.5; 2; 3.5 
print_r(Rank(array(4, 76, 34, 13, 34, 34))); // 1; 6; 4; 2; 4; 4 
관련 문제