PHP关键字函数在合并两个数组后中断


PHP keyword function breaks after merging two arrays

此php函数检索字符串中使用的常用单词列表,并排除单词黑名单。

阵列1:a、b、c

虽然默认的黑名单很有用,但我需要从数据库中添加单词到黑名单中。

阵列2:d,e,f

我添加了MYSQL,它从我们的服务表中的一个字段中获得了一个额外的列表。我将单词分解成一个数组,并在函数开始时将两个数组合并,这样黑名单现在就是

阵列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

如果数据库中的额外黑名单是在Windows客户端的管理面板中填充的,则每个单词的末尾可能会有一个杂散''r。因此,您的列表将是a、b、c、d''r、e''r、f''r。

尝试替换此行:

$removingblack_array = explode("'n", $gettingblack_row["g_serv_blacklist"]);

这个:

$removingblack_array = preg_split('/('r|'n|'r'n)/', $gettingblack_row["g_serv_blacklist"]);