2010-04-29 3 views
7

возьмите эту строку в качестве примера: «Увидят вас завтра в Лондоне и в Кенте послезавтра».php - Как преобразовать строку в ассоциативный массив его ключевых слов

Как бы преобразовать это ассоциативный массив, который содержит ключевые слова, как ключи, в то время как предпочтительно хватает общих слов, например:

Array ([завтра] => 2 [Лондон] => 1 [ Kent] => 1)

Любая помощь очень ценится.

ответ

0

используя черный список слов, не должны быть включены

$str = 'will see you in London tomorrow and Kent the day after tomorrow'; 
$skip_words = array('in', 'the', 'will', 'see', 'and', 'day', 'you', 'after'); 
// get words in sentence that aren't to be skipped and count their values 
$words = array_count_values(array_diff(explode(' ', $str), $skip_words)); 

print_r($words); 
7

Я бы сказал, вы могли бы:

  • разбить строку в массив слов
    • с explode
    • или preg_split
    • в зависимости от сложности вы будете принимать за свои слова сепараторы
  • us e array_filte r только для сохранения линий (т.слова), которые вы хотите
    • функции обратного вызова придется вернуться ложными для всех некорректных слов-
  • и, затем, использовать array_count_values на результирующий список слов
    • , который будет рассчитывать сколько раз каждый из слов присутствует в массиве слов



EDIT: и просто для удовольствия, вот быстрый пример:

Прежде всего, строка, которая получает разобранное слова:

$str = "will see you in London tomorrow and Kent the day after tomorrow"; 
$words = preg_split('/\s+/', $str, -1, PREG_SPLIT_NO_EMPTY); 
var_dump($words); 

Который получает вас :

array 
    0 => string 'will' (length=4) 
    1 => string 'see' (length=3) 
    2 => string 'you' (length=3) 
    3 => string 'in' (length=2) 
    4 => string 'London' (length=6) 
    5 => string 'tomorrow' (length=8) 
    6 => string 'and' (length=3) 
    7 => string 'Kent' (length=4) 
    8 => string 'the' (length=3) 
    9 => string 'day' (length=3) 
    10 => string 'after' (length=5) 
    11 => string 'tomorrow' (length=8) 


Затем filteting:

function filter_words($word) { 
    // a pretty simple filter ^^ 
    if (strlen($word) >= 5) { 
     return true; 
    } else { 
     return false; 
    } 
} 
$words_filtered = array_filter($words, 'filter_words'); 
var_dump($words_filtered); 

который выводит:

array 
    4 => string 'London' (length=6) 
    5 => string 'tomorrow' (length=8) 
    10 => string 'after' (length=5) 
    11 => string 'tomorrow' (length=8) 


И, наконец, подсчет:

$counts = array_count_values($words_filtered); 
var_dump($counts); 

И конечный результат:

array 
    'London' => int 1 
    'tomorrow' => int 2 
    'after' => int 1 


Теперь до вас, чтобы создать здесь ;-)
В основном, вы будете работать на:

  • А лучше взрывающийся функцию, которая имеет дело с ponctuation (или иметь дело с этим в течение фильтрация)
  • «интеллектуальная» функция фильтрации, которая соответствует вашим потребностям лучше, чем мое

получайте удовольствие!

+0

поститься для меня. снова зачерпнул. – dnagirl

+0

'str_word_count' также может быть интересным: http://www.php.net/manual/en/function.str-word-count.php –

+0

Спасибо, что работает. можно ли получить конечный результат без «int»? то естьпросто номер сам по себе – Steven

1

У вас может быть таблица с общепринятыми словами, а затем переходите через строку по одному слову за раз, проверяя, существует ли она в таблице, если нет, то добавьте ее в свой ассоциативный массив или +1, если это уже существует.

Смежные вопросы