Как посчитать вхождения нескольких паттернов в длинную строку? - PullRequest
1 голос
/ 03 октября 2009

У меня есть длинная строка и массив названий стран. Итак, массив выглядит примерно так:

array('Afghanistan', 'Bulgaria', 'United States', 'Bulgaria', ...)

Мне нужно посчитать, сколько раз каждая страна появляется в строке. Есть ли быстрый и изящный способ сделать это, то есть какой-то магический preg_match_all , который получает массив шаблонов, или я должен пройти через все страны?

Ответы [ 5 ]

3 голосов
/ 03 октября 2009

Я бы просто использовал хеш-таблицу (ассоциативный массив) и прошел бы по вашим странам:

// Count:
$country_names = array('Afghanistan', 'Bulgaria', 'United States', ...);
$country_count = array();
foreach ($country_names as $name) {
  $country_count[$name]++;
}

// Then display:
foreach ($country_names as $name) {
  echo "Found " . $country_count[$name] . " occurrences of $name.\n";
}
2 голосов
/ 03 октября 2009

Попробуйте использовать substr_count http://us3.php.net/manual/en/function.substr-count.php

$yourtmplongstring = strtolower($yourlongstring);
# the above will solve any case sensitive issues
$country_names = array('Afghanistan', 'Bulgaria', 'United States', ...);
$country_count = array();
foreach ($country_names as $name) {
    $occurances = substr_count($name, $yourtmplongstring );
    $country_count[$name] = $occurances;
}

Надеюсь, это то, что вы искали!

2 голосов
/ 03 октября 2009

Если вы хотите что-то невероятно быстрое (но не быстрое для реализации), рассмотрите алгоритм Ахо Корасика . Здесь - реализация в PHP.

1 голос
/ 03 октября 2009

Вы можете использовать что-то вроде:

$country_names = array('Afghanistan', 'Bulgaria', 'United States', ...);
$country_names_preg = "/(" . implode("|", $country_names) . ")/";
preg_match_all($country_names_preg, $long_string, $matches);

//$matches will contain all of the country matches.
$echo "found: " . implode(", ", $matches);

// There would ideally be a check to make sure that $matches had something in it!
0 голосов
/ 03 октября 2009

Я не думаю, что вы можете сделать это одним вызовом, но пока вы выполняете итерацию по substr_count (), может быть быстрее, чем preg_ * для этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...