2013-04-10 20 views
5

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

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つの親指がある場合、10の親指が2つ高くなるなど、出力で「1つ」高い位置に移動する必要があります。

私は100,200,300のような各出力のキー(prio)を設定するために最初に配列を再現する必要があると思いますので、その間に行を設定するのに十分なスペースがありますか?

ありがとうございます!

+0

キー8を上に、キー2を2番目の位置に、次に1つおきに4以下を入力します。またはキー2はキー1に、キー8はキー6に移動しますか? – Chris

+0

私は一時的な "親指"を保存するいくつかのカウンター(1つ以上のフィールド)を作成する必要があり、5に達した場合、これで配列を並べ替えて0に設定するので、2回上がることはありません。 – Voitcus

+0

@Chrisこれらの結果は検索アクションから来ているので、すでに一定の重みを持っています。私はほとんどの親指で結果を言うために離れてすべてを投げることはありませんが最高です。私は、検索アルゴリズムとuser_inputsの組み合わせのようなものを作りたいと思っています。その理由は、親指を与えられた(ユーザー入力による)「優しく」ランク付けしたいのです。 5つの親指は1つ上の位置を意味し、10つの親指は2つ上の位置などを意味する。 – directory

答えて

1

あなたの例では、配列の配列をよく使うと思います。 (あなたがまだいないなら、質問からは分かりません。)そうです。

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

次に、スワップ機能を記述することから始めます。あなたのランキング機能のために今すぐ

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); 
+0

なぜdownvote?私はこれが私の答えより良いアプローチだと思う。 – enrey

+0

それは私のランク付けされた結果を戻すことはありません、関数を介して配列を取得する同じ配列を提供する:/あなたの関数は、結果をランク付けするようだ! – directory

0

だからあなたのランク付けのアレイのためのあなたのランク関数を呼び出し、あなたは、配列の配列を持っています:

$array = array(
    array('key' => 0, 'id' => 16103, 'Thumbs' => 0), 
    array('key' => 1, 'id' => 23019, 'Thumbs' => 0), 
    array('key' => 2, 'id' => 49797, 'Thumbs' => 5), //<- key 2 needs to switch with key 1 
    array('key' => 3, 'id' => 51297, 'Thumbs' => 0), 
    array('key' => 4, 'id' => 58106, 'Thumbs' => 0), 
    array('key' => 5, 'id' => 59927, 'Thumbs' => 4), //<- will be stay at this position 
    array('key' => 6, 'id' => 61182, 'Thumbs' => 0), 
    array('key' => 7, 'id' => 68592, 'Thumbs' => 0), 
    array('key' => 8, 'id' => 70238, 'Thumbs' => 10), //<- key 8 needs to switch with key 6 
    array('key' => 9, 'id' => 71815, 'Thumbs' => 0), 
    array('key' => 10, 'id' => 78588, 'Thumbs' => 0) 
); 

このケースでは、usort()を使用することができます。

usort($array, function($a, $b){ 
    $a_thumbs_val = floor($a['Thumbs']/5); 
    $a_val = $a_thumbs_val ? $a['key'] - $a_thumbs_val - 0.5 : $a['key']; 

    $b_thumbs_val = floor($b['Thumbs']/5); 
    $b_val = $b_thumbs_val ? $b['key'] - $b_thumbs_val - 0.5 : $b['key']; 
    return ($a_val > $b_val) ? 1 : -1; 
}); 


var_dump($array); 

を生成します:

array (size=11) 
    0 => 
    array (size=3) 
     'key' => int 0 
     'id' => int 16103 
     'Thumbs' => int 0 
    1 => 
    array (size=3) 
     'key' => int 2 
     'id' => int 49797 
     'Thumbs' => int 5 
    2 => 
    array (size=3) 
     'key' => int 1 
     'id' => int 23019 
     'Thumbs' => int 0 
    3 => 
    array (size=3) 
     'key' => int 3 
     'id' => int 51297 
     'Thumbs' => int 0 
    4 => 
    array (size=3) 
     'key' => int 4 
     'id' => int 58106 
     'Thumbs' => int 0 
    5 => 
    array (size=3) 
     'key' => int 5 
     'id' => int 59927 
     'Thumbs' => int 4 
    6 => 
    array (size=3) 
     'key' => int 8 
     'id' => int 70238 
     'Thumbs' => int 10 
    7 => 
    array (size=3) 
     'key' => int 6 
     'id' => int 61182 
     'Thumbs' => int 0 
    8 => 
    array (size=3) 
     'key' => int 7 
     'id' => int 68592 
     'Thumbs' => int 0 
    9 => 
    array (size=3) 
     'key' => int 9 
     'id' => int 71815 
     'Thumbs' => int 0 
    10 => 
    array (size=3) 
     'key' => int 10 
     'id' => int 78588 
     'Thumbs' => int 0 

注:同じ位置にあるべき2つのエントリをusortが不安定なソートを行うことから、いずれかの方法arroundのかもしれません。あなたはusortでそのクロージャを強化することで、いくつかのより複雑な比較を追加することができます。

関連する問題