2013-04-10 114 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个拇指时,它需要在输出中移动“1”,当它有10个拇指2更高时,依此类推。

我想我应该重现数组,首先为每个输出设置键(prio),如100,200,300,所以我们有足够的空间来设置行之间?

在此先感谢!

+0

所以你想要8键在顶部,键2在第二个位置,然后每个其他4个或更少的条目?或者键2是否按键1和键8键6? – Chris 2013-04-10 09:24:01

+0

我认为你应该制作一些用来存储临时“大拇指”的计数器(一个字段),如果它达到五个,则按此排列数组,然后将其设置为零,因此它不会增加两次。 – Voitcus 2013-04-10 09:25:56

+0

@Chris这些结果来自搜索动作,因此它们已具有一定的权重。我不会抛弃所有这些,说大多数大拇指的结果是最好的。我想在搜索算法和user_inputs之间进行一种组合,这就是为什么我想按照(通过用户输入)给予拇指“轻轻”排名。 5个拇指表示一个位置较高,10个拇指两个位置较高等。 – directory 2013-04-10 09:38:49

回答

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 2013-04-15 18:45:15

+0

它不会给我排名的结果,通过函数获取数组提供相同的数组:/你的函数似乎排名的结果好吗?! – directory 2013-04-16 08:17:54

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没有定见排序。你可以通过提高封闭性来增加一些更复杂的比较。