<?php
/**
* Aggregates values from log files with limited memory usage.
*
* @param array $logFiles An array of log file paths.
* @param string $aggregationKey The key to aggregate values by.
* @param callable $aggregationFunction A function to apply for aggregation (e.g., array_sum, array_count_values).
* @return array An associative array containing the aggregated values.
*/
function aggregateLogFiles(array $logFiles, string $aggregationKey, callable $aggregationFunction): array
{
$aggregatedData = [];
foreach ($logFiles as $logFile) {
if (file_exists($logFile)) {
$logData = file($logFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // Read log file
if ($logData) {
foreach ($logData as $line) {
if (strpos($line, $aggregationKey) !== false) {
// Extract the value based on the aggregation key
preg_match('/' . preg_quote($aggregationKey, '/') . '=\s*([^\s]+)/', $line, $matches);
if (isset($matches[1])) {
$value = trim($matches[1]);
if (isset($aggregatedData[$value])) {
$aggregatedData[$value][] = $value; // Add to existing array
} else {
$aggregatedData[$value] = [$value]; // Create new array
}
}
}
}
}
} else {
error_log("Log file not found: " . $logFile);
}
}
// Apply the aggregation function to the aggregated data
foreach ($aggregatedData as $key => $values) {
$aggregatedData[$key] = $aggregationFunction($values);
}
return $aggregatedData;
}
// Example Usage:
/*
$logFiles = ['log1.txt', 'log2.txt'];
$aggregationKey = 'user_id';
$aggregationFunction = function (array $values) {
return array_count_values($values); // Count occurrences of each user_id
};
$aggregatedResults = aggregateLogFiles($logFiles, $aggregationKey, $aggregationFunction);
print_r($aggregatedResults);
*/
?>
Add your comment