поиск в массиве за последние 7 вхождений - PullRequest
1 голос
/ 23 января 2012

Я пишу php-код для поиска различных переменных в текстовом файле ....

Данные перечисляются построчно в плоском файле, и формат для перечисления данных:

date | time | ip | geo-location (city) | //url

Данные сохраняются в виде лог-файла ('track-log.txt')

Код, который у меня имеется на данный момент:

$log_file = file_get_contents('track-log.txt');

$log_lines = explode(PHP_EOL, $log_file);

$log_lines = array_flip($log_lines);

unset($log_file);

, разбивает текстовый файлв строки, затем переворачивает строки назад, чтобы они были перечислены в массиве $ log_lines [*] как последняя строка в текстовом файле, отображаемая сначала как $ log_lines [0]

Мне нужно подсчитать, сколько вхожденийесть «дата», которые совпадают ...

<..... lots of logs here .... then .....>

jan 1st 2012 | data.....
jan 1st 2012 | data ....
jan 1st 2012 | data ....
jan 1st 2012 | data ....
jan 1st 2012 | data ....
jan 2nd 2012 | data ....
jan 2nd 2012 | data ....
jan 2nd 2012 | data .... <end log>

Представьте, что это конец журнала .... Я хотел бы:

$count[0] = 3 // last 3x dates are the same
$count[1] = 5 // the 5x dates before that are the same

Так что я могуиспользуйте

echo $count[0];

Для отображения количества самых последних значений в части «date» журнала.

Я бы хотел, чтобы массив $ count [*] прекратил вывод списка @ 7 строк....

$ count [0];... до ... $ count [6]

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

....

дополнительная информация.... формат даты каждой строки в журналах

sunday, january 22, 2012 | 16:14:36 | 82.**.***.*** | bolton | //page_url

И формат даты всегда такой же, как и сценарий, который записывает каждую дату в каждой строке журнала

....

Ответы [ 3 ]

1 голос
/ 23 января 2012

эта функция изменяет ключ и значение и не инвертирует массив.

 $log_lines = array_flip($log_lines);

сделай так

$log_lines = array_reverse($log_lines);

сгенерировать массив count

$count = array();
$index = -1;
$last_date = false;
foreach ($log_lines as $lines) {
     //sunday, january 22, 2012 | 16:14:36 | 82.**.***.*** | bolton | //page_url
     list($date,) = explode("|",$lines,2); //extract date 

     if ($last_date == $date)
          $count[$index]++;
     else {
         $last_date = $date;
         $index++;
         if ($index>=7) break; // 8. Date -> break
         $count[$index] = 1;
     }
}
0 голосов
/ 23 января 2012

Вот функциональный подход к вашей проблеме.

$lines = file('track-log.txt');

// This is a group discriminator
// It must return a 'key' which is what to group by,
// (in this case, by column 1 of the input line).
// as well as the orginal value.
function col1group($line){
    $key = trim(current(explode('|', $line, 2)));
    return array($key=>$line);
}

// $grouper is the group-descriminator function.
// we generate a new array with our keys to group by, then group them by
// key with array_merge_recursive
function array_groupby($array, $grouper) {
    return call_user_func_array('array_merge_recursive', array_map($grouper, $array));
}

//This is all lines, in file order, grouped by date.
$linesbydate = array_groupby($lines, 'col1group');

// if you want just the last seven:
$last7dates = array_slice($linesbydate, -7);
// if you want numeric keys:
$last7groups = array_values($last7dates);
// if you want them in reverse order:
$last7groupsReversed = array_reverse($last7groups);

// desired output
var_dump($last7groupsReversed);

Используя строки с примерами, которые вы дали этой программе, вы получите:

array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(25) "jan 2nd 2012 | data ....
"
    [1]=>
    string(25) "jan 2nd 2012 | data ....
"
    [2]=>
    string(25) "jan 2nd 2012 | data ....
"
  }
  [1]=>
  array(5) {
    [0]=>
    string(25) "jan 1st 2012 | data.....
"
    [1]=>
    string(25) "jan 1st 2012 | data ....
"
    [2]=>
    string(25) "jan 1st 2012 | data ....
"
    [3]=>
    string(25) "jan 1st 2012 | data ....
"
    [4]=>
    string(25) "jan 1st 2012 | data ....
"
  }
}

Если вам нужно сгруппировать по некоторым другим критериямВы можете сделать это, создав другую функцию, такую ​​как col1group() и передав ее array_groupby().Вы также можете изменить саму строку в этой функции (например, вызвать rtrim() для удаления новых строк).

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

Это должно так подвох ...

<?php

$log_file = file_get_contents('track-log.txt');
$log_lines = explode(PHP_EOL, $log_file);
$log_lines = array_reverse($log_lines);
unset($log_file);
$count = array();
//loop through and itterate the count array using the date as the unique key
foreach($log_lines as $line){
    //explode this so we can use the date segment as a key
    $pieces = explode('|',$line);
    if (!isset($count[$pieces[0]])){
        //break out if we've hit the cap size
        if (count($count)>=7){break;}
        $count[$pieces[0]] = 0; 
    }
    $count[$pieces[0]]++;

}
//switch to a numeric index
$count = array_values($count);

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