按一列对日志文件行中的数据进行分组,并从另一列创建子数组

问题描述 投票:0回答:3

我有一个日志文件,另存为

{time} | {name} | {value1}
{time} | {name} | {value2}
{time} | {name2} | {value3}
{time} | {name3} | {value4}

{time} 是“自 Unix 纪元以来的秒数”中的时间戳

日志文件是逐行写入的,因此最新的日志行位于底部,

我正在尝试将这些值分类到 php 数组中。

假设我们有:

{time} | Steve | Pizza
{time} | Steve | Kebab
{time} | Steve | Burger
{time} | John | Kebab
{time} | John | Ice-Cream
{time} | Dave | Pizza
{time} | Derek | Ice-Cream
{time} | Derek | Fanta

我已经爆炸成数组$lines

这就是我可以用来获取变量的方法:

echo $lines[0][1] . "," . $lines[0][2];  // this will print ' Steve,Pizza '
echo $lines[3][2];  // this will print ' Kebab '

我正在尝试使用“$lines[$x][1]”作为数组键和“$lines[$x][2]”作为数组值来编写数组,以便我可以调用:

print_r($new_array);

获得:

array
     (
  [Steve] => Pizza
          => Kebab
          => Burger
     )
     (
  [John] => Kebab
         => Ice-Cream
     )
     (
  [Dave] => Pizza
     )
     (
  [Derek] => Ice-Cream
          => Fanta
     )

这样做的原因是我需要显示一个小表格,如下所示:

 _________________________________________
|       Steve       |      Pizza          |
|                   |      Kebab          |
|___________________|_____ Burger ________|
|       John        |      Kebab          |
|___________________|_____ Ice-Cream _____|
|______ Dave _______|_____ Pizza _________|
|       Derek       |      Ice-Cream      |
|___________________|_____ Fanta _________|

数组 $lines 已被格式化以删除所有早于 24 小时的“日志行”....

所以我认为我不需要限制数组键 {names} 的数量。

php arrays multidimensional-array grouping flat-file
3个回答
2
投票

没有完全测试,但尝试一下:

$new = array();
foreach($lines as $line)
{
    $new[$line[1]][] = $line[2];
}
print_r($new);

由 DJ-P.I.M.P 编辑...

$new = array();
foreach($lines as $line)
{
$new[$line[1]][] = $line[2];
}
// print_r($new);


foreach($new as $key => $news) {

echo $key . "<br>";

foreach($news as $k => $v) {

echo $news[$k] . "<br>";

}
}

这完全符合我的问题所问的......感谢@Aaron 的最初想法:)


0
投票

在子数组中添加共享相同键的值的不同变体:

$result = array();
for ($lines as $line) {
    if (!isset($result[$line[1]])) {
        $result[$line[1]] = array();
    }
    $result[$line[1]][] = $line[2];
}

0
投票

使用

fscanf()
解析分隔的日志文件行,并将数据保存在所需的组中。 演示

$result = [];
$handle = fopen('some.log', 'r');
while (fscanf($handle, '%*s | %s | %s', $name, $item)) {
    $result[$name][] = $item;
}
fclose($handle);
var_export($result);

输出:

array (
  'Steve' => 
  array (
    0 => 'Pizza',
    1 => 'Kebab',
    2 => 'Burger',
  ),
  'John' => 
  array (
    0 => 'Kebab',
    1 => 'Ice-Cream',
  ),
  'Dave' => 
  array (
    0 => 'Pizza',
  ),
  'Derek' => 
  array (
    0 => 'Ice-Cream',
    1 => 'Fanta',
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.