Задача: отсортировать выдачу из БД по числу вхождений тега у похожих материалов. К примеру, компонент K2 для Жумлы показывает похожие материалы в порядке их публикации. А нужно так: если у некоторых материалов совпадает бОльшее число тегов, чем у других, то они идут в первую очередь. Т.е. первым среди похожих материалов идет тот, у которого 3 тега совпадает с текущим материалом на странице, следующим идет - у которого 2 и т.д.

Решение:

Допустим мы получили массив ($itemsIDs) не уникальных ID материалов, которые связаны друг с другом (имеют общие теги в различных вариациях).

/* получаем число вхождений каждого ID */
$itemsIDs = array_count_values($itemsIDs);
/* сортируем в обратном порядке ассоциативно - чем больше вхождений, тем первее */
arsort($itemsIDs);
/* возвращаемся к исходному массиву (автоматически уникализировав его) */
$itemsIDs = array_keys($itemsIDs);
/* формируем порядок для сортировочного запроса */
$sql = implode(',', $itemsIDs);

И далее дописываем сортировочную часть запроса: 

$query .= " ORDER BY FIELD(i.id, $sql)";

P.S.

В компоненте K2 следует отредактировать файл моделей: /components/com_k2/models/itemlist.php В методе getRelatedItems после строк (примерно 901):

$itemsIDs = K2_JVERSION == '30' ? $db->loadColumn() : $db->loadResultArray();
if (!count($itemsIDs))
return array();

добавить первый кусок, а затем вставить второй кусок, поправив строчку (примерно на строке 947, где идет окончание формирования переменной $query):

$query .= " AND c.trash = 0 
AND (i.id) IN ({$sql})
ORDER BY FIELD(i.id, $sql)";

 

Наверх