2013-04-10 2 views
5

Я ищу, как построить ранг массива на основе значения.php array ranker, основанный на значении

У меня есть выходной массив как:

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 и так далее.

Я предполагаю, что сначала я должен воспроизвести массив, чтобы установить ключ (prio) для каждого выхода, например, 100 200 300, чтобы у нас было достаточно места для установки строки между?

Заранее благодарен!

+0

Значит, вы хотите, чтобы ключ 8 был сверху, ключ 2 на втором месте, а затем каждая другая запись с 4 или меньше? или ключ 2 просто подходит к ключу 1 и к 8-й клавише 6? – Chris

+0

Я думаю, вам нужно сделать какой-то счетчик (еще одно поле), в котором вы храните временные «большие пальцы», и если он достигает пяти, вы сортируете массив по этому параметру, а затем устанавливаете его на ноль, чтобы он не увеличивался дважды. – Voitcus

+0

@ Эти данные исходят из действия поиска, поэтому у них уже есть определенный вес. Я не буду бросать все это, чтобы сказать, что результат с большим пальцем - лучший. Я хочу сделать какую-то комбинацию между алгоритмом поиска и user_inputs, поэтому я хотел бы «нежно» оценивать (по пользовательскому вводу) с учетом больших пальцев. 5 больших пальцев означает одно положение выше, 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 записей, которые должны быть на той же позиции может быть так или иначе Arround, так как usort делает нестабильный вид. Вы можете пойти так, что, увеличив это закрытие в usort, добавив еще более сложное сравнение.

Смежные вопросы