Функция ключевого слова PHP разрывается после объединения двух массивов - PullRequest
0 голосов
/ 13 февраля 2012

Эта функция php извлекает список общих слов, используемых в строке, и исключает черный список слов.

Массив1: a, b, c

Хотя черный список по умолчанию полезен, яНужно добавить слова в черный список из базы данных.

Array2: d, e, f

Я добавил MYSQL, который получает дополнительный список из поля в нашей таблице служб.Я взрываю \ n из слов в массив и объединяю два массива в начале функции так, что черный список теперь

Array3: 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

1 Ответ

1 голос
/ 13 февраля 2012

Если дополнительный черный список в базе данных был заполнен в административной панели из клиента 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"]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...