だからあなたのランク付けのアレイのためのあなたのランク関数を呼び出し、あなたは、配列の配列を持っています:
$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でそのクロージャを強化することで、いくつかのより複雑な比較を追加することができます。
キー8を上に、キー2を2番目の位置に、次に1つおきに4以下を入力します。またはキー2はキー1に、キー8はキー6に移動しますか? – Chris
私は一時的な "親指"を保存するいくつかのカウンター(1つ以上のフィールド)を作成する必要があり、5に達した場合、これで配列を並べ替えて0に設定するので、2回上がることはありません。 – Voitcus
@Chrisこれらの結果は検索アクションから来ているので、すでに一定の重みを持っています。私はほとんどの親指で結果を言うために離れてすべてを投げることはありませんが最高です。私は、検索アルゴリズムとuser_inputsの組み合わせのようなものを作りたいと思っています。その理由は、親指を与えられた(ユーザー入力による)「優しく」ランク付けしたいのです。 5つの親指は1つ上の位置を意味し、10つの親指は2つ上の位置などを意味する。 – directory