поиск в массиве для наиболее распространенных случаев - PullRequest
0 голосов
/ 22 января 2012

У меня есть текстовый лог-файл, содержащий строки данных, разделенных "|"

, например,

date | time | ip | geo-location (city) | page viewed ......

Мне нужно найти 10 наиболее часто встречающихся "просмотров страниц" в тексте.файл ....

каждый журнал просмотра страницы указан как:

//pageurl 

, поскольку журнал находится на отдельных строках. Я предполагаю, что я буду искать URL страницы между

// [url name] \r\n

как бы я кодировал поиск, чтобы вывести список первых 10 URL-адресов и перечислить их в массив ....

например:

$url[0]  <<this would be the most occuring url
$url[1]  <<thos would be the second most occuring url

и т. Д...... пока я не смогу перечислить их до:

$url[9]  <<which would be the 10th most common url

Я не уверен, как я буду искать между "//" и "\ r \ n"

и затем преобразовать 10 самых распространенных вхождений в массив ...

edit: вот 2х строк моих журналов, просто чтобы помочь еще больше, если я смогу

sunday, january 22, 2012 | 16:14:36 | 82.**.***.*** | bolton | //error 
sunday, january 22, 2012 | 17:12:52 | 82.**.***.*** | bolton | //videos

1 Ответ

0 голосов
/ 22 января 2012

Исходя из предоставленной информации, вот довольно наивный подход:

/* get the contents of the log file */
$log_file = file_get_contents(__DIR__.'/log.txt');

/* split the log into an array of lines */
$log_lines = explode(PHP_EOL, $log_file);

/* we don't need the log file anymore, so free up some memory */
unset($log_file);

/* loop through each line */
$page_views = array();
foreach ($log_lines as $line) {
    /* get the text after the last pipe character (the page view), minus the ' //' */
    $page_views[] = ltrim(array_pop(explode('|', $line)), ' /');
}

/* we don't need the array of lines either, so free up that memory */
unset($log_lines);

/* count the frequency of each unique occurrence */
$urls = array_count_values($page_views);

/* sort highest to lowest (may be redundant, I think array_count_values does this) */
arsort($urls, SORT_NUMERIC);

print_r($urls);
/* [page_url] => num page views, ... */

/* that gives you occurrences, but you want a numerical 
   indexed array for a top ten, so... */

$top_ten = array();
$i = 0;
/* loop through the array, and store the keys in a new one until we have 10 of them */
foreach ($urls as $url => $views) {
  if ($i >= 10) break;
  $top_ten[] = $url;
  $i++;
}

print_r($top_ten);
/* [0] => page url, ... */

** Вывод скрипта: **

Array
(
    [videos] => 1
    [error ] => 1
)
Array
(
    [0] => videos
    [1] => error 
)

Это не самое оптимальное решение, и чем большеваш файл журнала, тем больше времени это займет.С этой целью вам может быть лучше войти в базу данных и выполнить запросы из нее.

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