【发布时间】:2012-02-13 00:17:13
【问题描述】:
此 php 函数检索字符串中使用的常用单词列表并排除单词黑名单。
数组1:a,b,c
虽然默认黑名单很有用,但我需要从数据库中将单词添加到黑名单中。
数组2:d,e,f
我添加了 MYSQL,它从我们的服务表中的一个字段中获取一个附加列表。 我从单词中将\n分解成一个数组,并在函数开头合并两个数组,这样黑名单就变成了
数组3:a,b,c,d,e,f
为了测试,我使用 print_r 来显示数组,它确实合并成功。
问题是这样的……
如果我手动将 d,e,f 添加到默认数组,脚本将返回一个干净的单词列表。 如果我将两个数组合并为一个,它会返回包含黑名单单词的单词列表。
为什么合并后的数组与添加到默认数组有什么不同?
这里是函数
function extractCommonWords($string,$init_blacklist){
/// the default blacklist words
$stopWords = array('a','b','c');
/// select the additional blacklist words from the database
$gettingblack_sql = "SELECT g_serv_blacklist FROM services WHERE g_serv_id='".$init_blacklist."' LIMIT 1";
$gettingblack_result = mysql_query($gettingblack_sql) or die(mysql_error());
$gettingblack_row = mysql_fetch_array($gettingblack_result);
$removingblack_array = explode("\n", $gettingblack_row["g_serv_blacklist"]);
// this adds the d,e,f array from the database to the default a,b,c blacklist
$stopWords = array_merge($stopWords,$removingblack_array);
// replace whitespace
$string = preg_replace('/\s\s+/i', '', $string);
$string = trim($string);
// only take alphanumerical chars, but keep the spaces and dashes too
$string = preg_replace('/[^a-zA-Z0-9 -]/', '', $string);
// make it lowercase
$string = strtolower($string);
preg_match_all('/\b.*?\b/i', $string, $matchWords);
$matchWords = $matchWords[0];
foreach ($matchWords as $key => $item) {
if ($item == '' || in_array(strtolower($item), $stopWords) || strlen($item) <= 3){
unset($matchWords[$key]);}}
$wordCountArr = array();
if (is_array($matchWords)) {
foreach ($matchWords as $key => $val) {
$val = strtolower($val);
if (isset($wordCountArr[$val])) {
$wordCountArr[$val]++;
} else {
$wordCountArr[$val] = 1;
}
}
}
arsort($wordCountArr);
$wordCountArr = array_slice($wordCountArr, 0, 30);
return $wordCountArr;
}
/// end of function
/// posted string = a b c d e f g
$generate = $_POST["generate"];
/// the unique id of the row to retrieve additional blacklist keywords from
$generate_id = $_POST["generate_id"];
/// run the function by passing the text string and the id
$generate = extractCommonWords($generate, $generate_id);
/// update the database with the result
$update_data = "UPDATE services SET
g_serv_tags='".implode(',', array_keys($generate))."'
WHERE g_serv_acct='".$_SESSION["session_id"]."'
AND g_serv_id='".$generate_id."' LIMIT 1";
$update_result = mysql_query($update_data);
if(!$update_result){die('Invalid query:' . mysql_error());}
else{echo str_replace(",",", ",implode(',', array_keys($generate)));}
/// end of database update
【问题讨论】:
-
合并数组和“普通”数组没有区别。我想,数组合并不是你的问题。在此处发布
var_dump($stopWords),以便我们查看此代码的工作原理。 -
数组看起来很正常,就像在 key > val 中一样。并以应有的方式返回浏览器。 \r 是问题所在。感谢您的支持。
标签: php mysql arrays keyword blacklist