背景
网站上的用户可以提供他们的个人资料'关键字'每个关键字用','分隔。例如:
green apples, bananas, red apples, pears
它以字符串形式存储在数据库中。
我有一个livesearch页面,用户可以按关键字搜索用户。在此搜索中,页面会将关键字建议为用户类型。例如,用户可以键入:
apples
,页面会建议
green apples
,red apples
。
方式
当输入发送到keywordsearch.php
时,页面会搜索以下内容:
$search_string_w = '%'.$search_string.'%';
$stmt = $dbh->prepare('SELECT `keywords` FROM `users` WHERE `keywords` LIKE ?');
$stmt->execute(array($search_string_w));
while($results = $stmt->fetch(PDO::FETCH_ASSOC)) {
$result_array[] = $results;
}
这将获取具有关键字的用户的行。但是,我想要做的就是将每个关键字显示为搜索建议,即使关键字多次出现也是如此。
if (isset($result_array)) {
foreach ($result_array as $result) {
$keyw = explode(', ', $result['keywords']);
$keyk = array_search($search_string, $keyw);
现在,$keyw[$keyk]
将返回一个关键字。因此,如果搜索结果为apples
,则只返回green apples
而不是red apples
。
问题
如何更改此代码以便返回所有匹配的搜索字词?
答案 0 :(得分:1)
array_search()
和array_keys()
只会找到apple
apple
。 preg_grep()
会提供包含apple
的任何条目,例如green apple
。
可以使用$result_array
preg_grep()
$keyw = explode(', ', $result['keywords']);
//an array you can implode or loop through
$keyk = preg_grep("/$search_string/", $keyw);
// for case-insensitive use: "/$search_string/i"
理想情况下,您应该有一个关键字表格,其中每个关键字都是自己的相关用户ID行。