PHP: список раз, когда слово было найдено? - PullRequest
1 голос
/ 01 сентября 2010

Я получил собственный журнал, примерно 29 МБ данных пользователя, включая пользовательский агент.Я хочу проанализировать его (по сути, просто поиск) и выяснить, сколько в нем встречается, скажем, «Firefox» или «MSIE», как анализатор мини-журнала.

Вот где я в тупике ..Я получил explode() новых строк и итерацию по массиву, используя:

if stripos($line, 'Firefox') $ff++;" 

или что-то глупое, но я понимаю, что это заняло бы много памяти / использовало бы много функций.

Как можно было бы перечислить количество случаев?

1 Ответ

5 голосов
/ 01 сентября 2010

Вы хотите прочитать файл построчно, чтобы избежать использования памяти с большим количеством данных.

$count = array('Firefox' => 0, 'MSIE' => 0, 'Others' => 0);
$handle = fopen("yourfile", "r");

if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);

        // actual counting here:
        if (stripos($buffer, 'Firefox')) {
            $count['Firefox']++;
        } else if (stripos($buffer, 'MSIE')) {
            $count['MSIE']++;

        // this might be irrelevant if not all your lines contain user-agent
        // strings, but is here to show the idea
        } else {
            $count['Others']++; 
        }
    }
    fclose($handle);
}

print_r($count);

Кроме того, в зависимости от формата вашего файла (который не был предоставлен), вы можете использовать регулярные выражения или более точный метод подсчета случаев, например:

$count = array('Firefox' => 0, 'MSIE' => 0, 'Others' => 0);
$handle = fopen("yourfile", "r");

if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        $ua = get_user_agent($buffer);  
        $count[$ua]++;
    }
    fclose($handle);
}

print_r($count);

/* @param $line
 * @return string representing the user-agent
 *
 * strpos() works for the most part, but you can use something more 
 * accurate if you want
 */
function get_user_agent($line) {
    // implementation left as an exercise to the reader
}
...