сортировка — сортировка массива по количеству совпадений и выбор наилучшего соответствия переполнению стека

Я создаю поиск на основе тегов и хочу отсортировать результаты поиска по релевантности. Лучшее соответствие и количество тегов актуальны. Представьте, что это поисковый запрос:

$search = ['A', 'B'];

и вот результат:

$result = [
[
'id' => 3011,
'tags' => ['A', 'B', 'C']
],
[
'id' => 10798,
'tags' => ['A','C','D','E']
],
[
'id' => 92,
'tags' => ['A']
],
[
'id' => 4237,
'tags' => ['A', 'B']
]
];

Я хочу реорганизовать все это следующим образом:

$sortResult = [
[
'id' => 4237,
'tags' => ['A', 'B'] // At first place because has 2 values and the search 2, difference 0 and matched good to search
],
[
'id' => 3011,
'tags' => ['A', 'B', 'C'] // At second place because has 3 values and the search 2, difference 1 and matched good to search
],
[
'id' => 92,
'tags' => ['A'] // At third place because has 1 value and the search 2, difference 1
],
[
'id' => 10798,
'tags' => ['A','C','D','E'] // Down here because has 4 values and the search 2, difference 2
]
];

0

Решение

Не уверен, что это работает во всех случаях, но дает желаемый результат для ваших текущих данных:

<?php
$search = ['A', 'B'];

$result = [
[
'id' => 3011,
'tags' => ['A', 'B', 'C'],
],
[
'id' => 10798,
'tags' => ['A', 'C', 'D', 'E'],
],
[
'id' => 92,
'tags' => ['A'],
],
[
'id' => 4237,
'tags' => ['A', 'B'],
],
];

usort($result, function ($a, $b) use ($search) {
$simA = count(array_intersect($a['tags'], $search));
$simB = count(array_intersect($b['tags'], $search));
$diffA = count(array_diff($a['tags'], $search));
$diffB = count(array_diff($b['tags'], $search));
$absA = abs(count($a['tags']) - count($search));
$absB = abs(count($b['tags']) - count($search));

$score = 0;

$score += $simB - $simA;
$score += $diffA - $diffB;
$score += $absA - $absB;

return $score;
});

echo '<pre>';
print_r($result);
echo '</pre>';

http://phpio.net/s/7yhb

2

Другие решения

Других решений пока нет …