2010-08-11 12 views
5

Bağlar olduğunda bir dizideki sayısal değerlere sıralama atamaya çalışırken nereden başlayacağımı öğrenmek için uğraşıyorum. gibi başka bir diziyeBağlantılar olduğunda bir diziye bir sıra numarası nasıl atanılır

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

: Yani, örneğin, aşağıdaki gibi bir dizi açmanız gerekmektedir aynı sayıda dizide birden fazla kez ortaya çıktığında Temelde

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

, atanan Bu sayılara sıralamak, sıraların ortalamasıdır. Yani, 3 ve 4 sıraya giren iki 34'lük yerine, ikisi de 3.5. Benzer şekilde, eğer 34'ün 3 kopyası varsa, o zaman 3 atanan sıra 3'e bölünecektir. Herhangi bir yardım çok takdir edilecektir!

Çok teşekkürler,

Adam

+1

Ve herhangi bir bulmuyorum dizinin iki biçimi arasındaki şema. – Sarfraz

+0

Daha fazlasını açıklayabilir misiniz? – shox

+0

Bu çok alışılmadık bir ilişki yöntemi. –

cevap

2

Ben bununla eğlendim!

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; 
} 

böyle kullanın:

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

irade çıkışı:

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

wich aynıdır:

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

beklendiği gibi!

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; 
} 

Örnek (demo):

1

seni varsayalım aynı değerde berabere üç ya da dört veya n değerleri vardır davalarını gerekir.

Hiç PHP gurusu değilim, ama burada bir yaklaşım (sözde kod) bir sıra işlevini tanımlamaya var:

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

Bu bile için çalıştığını kendinizi ikna kağıt üzerinde birkaç örnek çalışmanız gerekebilir üç kat ve daha yüksek; s'a bağımlıdır, böylelikle kopyalar bitişiktir.

+1

S'nin değerlerini giriş dizisinin sırasına nasıl geri alırsınız? – aaronasterling

+0

Siparişinizi tekrar yerine koymuyorsunuz, buna gerek yok (ve yine de yapamazsınız). Orijinal düzeni orijinal dizinizdir. 's' bir * kopyasıdır *. – Bevan

+0

, bu dizinin 0 veya 1 dizinli olması gerektiğini varsayar mı? – Tom

2

İşte bunu yapmanın bir yolu.

<?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

kabul çözeltisi (ve çok diğerleri) olmaları gereken şekilde daha karmaşık görünmektedir

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 
İlgili konular