Я пытаюсь вычислить, насколько близко элемент соответствует определенным предпочтениям пользователя. Вот как я думал сделать это. Но я не слишком опытен и хотел знать, есть ли лучший способ сделать это.
Использование автомобилей в качестве простого примера. Мы сузим его до цвета и стиля автомобиля (автомобиль, фургон и т. Д.).
<Ч />
Часть первая
Пользователь выбирает в HTML-формате следующее:
Color: ( )White, (*)Black, ( )Red
Style: ( )Car, ( )Van, (*)Suv, (*)Truck
Теперь, если я преобразую вышеприведенное в двоичное число, где первая цифра = первый атрибут (белый) и продолжается.
Код атрибута = 0100011 (черный, внедорожник, грузовик)
<Ч />
Часть вторая
Теперь с MySQL
Select item_id, attribute_code FROM items
items table = [item_id][attribute_code]
Далее используйте PHP, чтобы вычислить, насколько точно каждый код атрибута элементов соответствует предпочтениям пользователя.
// Set users attribute code to var
$user_pref = $_POST['user_att_code'];
while($row=mysql_fetch_array($result))
{
// Pull attribute_code from database and put into var
$item_code = $row['attribute_code'];
// Set counters
$count_digit = 0;
$count_match = 0;
// Length of attribute code
$length = 7;
// Start calculating match
while($count_digit <= $length)
{
// Does first digit of users code = 1?
// Does first digit of items code = 1?
if($user_pref{$count_digit} != 0 && $user_pref{$count_digit} == $item_code{$count_digit})
{
// Add a positive match point to counter
$count_match++;
}
// Next digit in code
$count_digit++;
}
if($count_match > 0)
{
// Make array of item_id and match amount
$item_search [$row['item_id']] = $count_match;
}
}
// Sort array by most similar
arsort($item_search);
Затем для вычисления процента используется немного больше кода.
Выше было сделано следующее: он взял требуемый пользователем код атрибута и сравнил его с каждым кодом атрибута элементов в базе данных. Он проходил цифра за цифрой через каждый код и подсчитывал каждый раз, когда происходило совпадение. В конце он поместил счетчик для этого элемента в массив и перешел к коду атрибута следующего элемента.
user: 0100011
it_1: 0100011 = 100% match
it_2: 0100100 = 50% match
it_3: 0011000 = 0% match
// If you notice the 50% does not make sense ignore it.
// I left something out for simplification.
Теперь я знаю, что это работает. Тем не менее, это не похоже на хороший способ сделать это. Производительность в основном. Предполагая более 150 000 элементов и длину кода атрибута около 200 . Это как минимум 30 000 000 вычислений для одного поиска (на основе выше).
Возможно, есть другой способ? Это большое дело?