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

问题描述 投票: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} 的数量

提前感谢您的任何建议....已为此尝试了所有逻辑解决方案:rant:

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.