2013-02-22 2 views
0

вот небольшой пример того, что я пытаюсь выполнить. У меня есть массив из запроса MySQL, который отображается. Я хочу отсортировать массив на основе коэффициента. Коэффициент рассчитывается в строке в зависимости от времени публикации статьи & количества полученных голосов. Что-то вроде этого:PHP - Сортировка Array Based Off Factor :: usort?

// ... MySQL query here 
$votes = $row['0'] 
$seconds = strtotime($record->news_time)+time(); 
$sum_total = pow($votes,2)/$seconds; 

Так массив Thats ближайшие выглядит примерно так:

Array (
    [0] => stdClass Object (
     [id] => 13 
     [news_title] => Article 
     [news_url] => http://website.com/article/14 
     [news_root_domain] => website.com 
     [news_category] => Business 
     [news_submitter] => 2 
     [news_time] => 2013-02-18 12:50:02 
     [news_points] => 2 
    ) 
    [1] => stdClass Object (
     [id] => 14 
     [news_title] => Title 
     [news_url] => http://www.website.com/article/2 
     [news_root_domain] => www.website.com 
     [news_category] => Technology 
     [news_submitter] => 1 
     [news_time] => 2012-10-02 10:03:22 
     [news_points] => 8 
    ) 
) 

Я хочу, чтобы отсортировать вышеупомянутый массив, используя фактор я уже упоминал выше. Идея состоит в том, чтобы показать наивысшие рейтинговые статьи сначала в списке (используя рассчитанный коэффициент) вместо метода сортировки по умолчанию, в который входит массив. Кажется, usort может быть моим лучшим выбором, но дайте мне знать, что вы все думают?

+1

Почему бы не отсортировать по этому фактору с помощью MySQL? В противном случае, что такое '$ record'? И где «голоса» вступают в игру? Я не вижу ссылки на это. – Madbreaks

+0

Фактор не хранится в MySQL. Он динамически генерируется на основе времени и голосов. Голоса - $ rValue - переименованы в вопрос, так что это более понятно. :) Голоса в основном заполняются из значения «news_points» внутри массива. $ record - для каждого оператора, который я запускаю. – viablepath

+0

@viablepath: Итак, как вы оцениваете 'news_points'? это какое-то общее, или это значение, указанное в записи? – prodigitalson

ответ

1

ли все это в запросе:

SELECT n.*, (POW(?, 2)/(UNIX_TIMESTAMP(n.news_time) + UNIX_TIMESTAMP(NOW()))) as rank 
FROM news_table n 
ORDER BY rank; 

Теперь, чтобы получить голоса вы, возможно, придется сделать подзапрос или присоединиться, но я не могу посоветовать на что, потому что вы не дают достаточно информации о том, где голоса исходят. Вы, однако, можете предоставить голос в запрос, а вместо того, чтобы выбрать все в одном кадре что-то вроде:

$sql = sprintf('SELECT n.*, (POW(%d, 2)/(UNIX_TIMESTAMP(n.news_time) + UNIX_TIMESTAMP(NOW()))) as rank FROM news_table n ORDER BY rank', $votes); 

Помимо этого, да вы могли бы использовать usort, но это также потребует от вас есть все набор записей в памяти для обеспечения точной сортировки, что может быть проблематично в какой-то момент.

+0

По какой-то причине это возвращает только 1 элемент из массива, с фанки-форматированием. Поэтому, чтобы быть ясным, ваше высказывание должно было запустить этот запрос, а затем пропустить через элементы, чтобы отобразить их правильно? Похоже, это хорошее решение, мне просто нужно получить действующий запрос. Спасибо за вашу помощь! :) – viablepath

+0

Да, это то, что я говорю. Если вы можете опубликовать дамп некоторых ваших данных и определение таблицы, я не могу исправить запрос. – prodigitalson

+0

Кроме того, если 'news_points' всегда значение' news_points' на запись, то вы можете просто использовать 'POW (n.news_points, 2)' – prodigitalson

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