Macintosh
Новичок
Всем приветик!
Ребята, помогите пожалуйста упростить метод, и вообще объясните где я не прав, и не ужели, вот то, что я тут придумал, так делают все?
Уж очень ресурсоёмкая задача получается, или может получаться, в зависимости от того, как быстро найдётся нужная информация в БД.
Задача:
Есть таблица в которой хранится информация об изображениях.
На сайте, когда открываешь одно из изображений, нужно показать рядом еще 3 похожих изображения.
Тоесть, в базе нужно найти похожие поля. Сначала проверяем по ключевым словам, в тойже категории, сначала более старые(ранее загруженные) изображения, если не найдет 3 похожих изображения, ищем в обратном порядке, более новые(позже загруженные), если не насобиралось 3 похожих изображений, то повторяем процедуру, только уже во всех остальных категориях. Может быть уже сам принцип поиска не верен? И это как-то делают по другому?
В общем вот что у меня получилось:
Немного поясню что тут чего:
$id - содержит id изображения.
$keywords - содержит строку ключевых слов, типа 'девушка, платье, красотка, блондинка'.
$category - id категории.
sql_fetch_assoc - метод из другого класса, который из БД возвращает массив массивов. Тоесть, fetch_assoc() прогнанный через foreach.
Делаю такую задачу в первый раз, так что если полный бред сильно не ругайте )) Буду рад любым замечаниям и советам.
Ребята, помогите пожалуйста упростить метод, и вообще объясните где я не прав, и не ужели, вот то, что я тут придумал, так делают все?
Уж очень ресурсоёмкая задача получается, или может получаться, в зависимости от того, как быстро найдётся нужная информация в БД.
Задача:
Есть таблица в которой хранится информация об изображениях.
На сайте, когда открываешь одно из изображений, нужно показать рядом еще 3 похожих изображения.
Тоесть, в базе нужно найти похожие поля. Сначала проверяем по ключевым словам, в тойже категории, сначала более старые(ранее загруженные) изображения, если не найдет 3 похожих изображения, ищем в обратном порядке, более новые(позже загруженные), если не насобиралось 3 похожих изображений, то повторяем процедуру, только уже во всех остальных категориях. Может быть уже сам принцип поиска не верен? И это как-то делают по другому?
В общем вот что у меня получилось:
Немного поясню что тут чего:
$id - содержит id изображения.
$keywords - содержит строку ключевых слов, типа 'девушка, платье, красотка, блондинка'.
$category - id категории.
sql_fetch_assoc - метод из другого класса, который из БД возвращает массив массивов. Тоесть, fetch_assoc() прогнанный через foreach.
PHP:
public function similar_images($id, $keywords, $category){
$keywords = explode(", ", $keywords);
$similar_images = array();
$limit = 3;
$count = 1;
while(count($similar_images) != 3 and $count != 5){
foreach($keywords as $keyword){
if($count == 1){
$query = "SELECT `id`, `path_small` FROM `images` WHERE `keywords` REGEXP '[[:<:]]".$keyword."[[:>:]]'
AND `category_id` = '$category' AND `id` < '$id' ORDER BY `id` DESC LIMIT $limit";
}else if($count == 2){
$query = "SELECT `id`, `path_small` FROM `images` WHERE `keywords` REGEXP '[[:<:]]".$keyword."[[:>:]]'
AND `category_id` = '$category' AND `id` > '$id' ORDER BY `id` ASC LIMIT $limit";
}else if($count == 3){
$query = "SELECT `id`, `path_small` FROM `images` WHERE `keywords` REGEXP '[[:<:]]".$keyword."[[:>:]]'
AND `id` < '$id' ORDER BY `id` DESC LIMIT $limit";
}else if($count == 4){
$query = "SELECT `id`, `path_small` FROM `images` WHERE `keywords` REGEXP '[[:<:]]".$keyword."[[:>:]]'
AND `id` > '$id' ORDER BY `id` ASC LIMIT $limit";
}
if($similars = $this->sql_fetch_assoc($query, true)){
foreach($similars as $similar){
if($limit != 3){
$check = true;
foreach($similar_images as $image){
if(in_array($similar['id'], $image)){
$check = false;
break;
}
}
if($check){
$similar_images[] = $similar;
$limit--;
}
}else{
$similar_images[] = $similar;
$limit--;
}
}
if(count($similar_images) == 3){
return $similar_images;
}
}
}
$count++;
}
return $similar_images;
}