5

値に基づいて配列ランカーを構築する方法を探しています。

次のような配列出力があります。

key => 0 | id => 16103 | Thumbs => 0 
key => 1 | id => 23019 | Thumbs => 0 
key => 2 | id => 49797 | Thumbs => 5 <- key 2 needs to switch with key 1 
key => 3 | id => 51297 | Thumbs => 0 
key => 4 | id => 58106 | Thumbs => 0 
key => 5 | id => 59927 | Thumbs => 4 <- will be stay at this position 
key => 6 | id => 61182 | Thumbs => 0
key => 7 | id => 68592 | Thumbs => 0 
key => 8 | id => 70238 | Thumbs => 10 <- key 8 needs to switch with key 6 
key => 9 | id => 71815 | Thumbs => 0 
key => 10 | id => 78588 | Thumbs => 0 
etc..

上記の配列出力を再現する関数を次のように書きたいと思います。レコードに 5 つの親指がある場合、出力で「1」上に移動する必要があり、10 個の親指がある場合は 2 つ上に移動する必要があります。

最初に配列を再現して、100,200,300 などの各出力のキー (prio) を設定する必要があると思います。間に行を設定するのに十分なスペースがありますか?

前もって感謝します!

4

2 に答える 2

1

あなたの例では、配列の配列を使用したほうがよいと思います。(まだ知らない場合は、質問からは明らかではありません。)そのように。

$array = array();
$array[0] = array('id'=>16103, 'Thumbs'=>0);
$array[1] = array('id'=>16103, 'Thumbs'=>0);
...

次に、swap 関数を作成することから始めます。

function swap (&$arr,$key1,$key2) {
    $temp=$arr[$key1];
    $arr[$key1]=$arr[$key2];
    $arr[$key2]=$temp;
    // the & before the $arr parameter makes sure the array is passed as a reference. So no need to return the new array at the end.
}

ランキング機能については次のとおりです。

function rank(&$arr) {
    for ($i = 0; $i < count($arr); $i++) {
        if ($arr[$i] < 5) continue;
        $places_to_move = $arr[i]['Thumbs'] / 5; // get number of places to promote the entry
        $places_to_move = max($places_to_move, $i); // make sure we don't move it out of the array bounds
        swap($arr, $i, $i - $places_to_move);
    }
}

次に、ランク付けされていない配列のランク関数を呼び出すだけです

rank($array);
于 2013-04-10T09:38:36.507 に答える