php - 将数组键与前一个数组元素连接起来
问题描述
我正在尝试从我的日志中删除重复的时间戳,因此重复行中的数组值必须连接到前一个数组行的值中。
到目前为止,我已经设法删除了重复的时间戳。但是我在将数组值连接到以前的值时遇到了麻烦,假设该特定数组中不存在日期戳。
请帮我将这些值合并到前一个数组中?
日志文件遵循以下格式:
20160420084726:-
20160420085418:[111783178, 111557953, 111646835, 111413356, 111412662, 105618372, 111413557]
20160420085418:[111413432, 111633904, 111783198, 111792767, 111557948, 111413225, 111413281]
20160420085418:[111413432, 111633904, 111783198, 111792767, 111557948, 111413225, 111413281]
20160420085522:[111344871, 111394583, 111295547, 111379566, 111352520]
20160420090022:[111344871, 111394583, 111295547, 111379566, 111352520]
如何删除重复的时间戳,同时将值保留到前一行,同时保留最后一个包含的值 /n 换行符。
<?php
$filename = "datesandids.log";
$lines = explode("\n", file_get_contents($filename));
print_r($lines);
$count = count($lines);
for ($i = 0;$i < $count;$i++) {
$lineattr = explode(":", $lines[$i]);
echo $lines[$i];
}
foreach ($lines as $linevar => $row) {
$line = explode(":", $linevar);
print_r($lines);
}
$handle = fopen("$filename", "r");
$datevar = array();
while ($line = fgets($handle)) {
$line = trim($line);
$data = explode(":", $line);
$datevar[] = $data;
}
var_dump($datevar);
$found = array();
function concatArray($array, $keys, $glue = " ") {
$last = null;
foreach ($array as $key => & $value) {
if (in_array($key, $keys)) {
if ($last === null) {
$last = $key;
continue;
}
$array[$last] .= $glue . $value;
unset($array[$key]);
}
}
return $array;
}
foreach ($datevar as $i => $x) {
if (in_array($x[0], $found)) {
$datevar[$i][0] = '';
$date = array(
$datevar
);
print_r(concatArray($date, array(
0,
1
)));
}
else {
$found[] = $x[0];
}
}
print_r($datevar);
foreach ($datevar as $key => $value) {
$datevar[$key] = preg_replace("/\[/", "", $value);
}
foreach ($datevar as $key => $value) {
$datevar[$key] = preg_replace("/\]/", "", $value);
}
print_r($datevar);
?>
我正在尝试生成以下数组信息:
Array(
[0] => Array(
[0] => 20160420084726
[1] => -
)
[1] => Array(
[0] => 20160420085418
[1] => 111783178, 111557953, 111646835, 111413356, 111412662, 105618372, 111413557, 111413432, 111633904, 111783198, 111792767, 111557948, 111413225, 111413281, 111413432, 111633904, 111783198, 111792767, 111557948, 111413225, 111413281
)
[2] => Array(
[0] => 20160420085522
[1] => 111344871, 111394583, 111295547, 111379566, 111352520
)
[3] => Array(
[0] => 20160420090022
[1] => 111344871, 111394583, 111295547, 111379566, 111352520
)
)
我实际上得到:
Array(
[0] => Array(
[0] => 20160420084726
[1] => -
)
[1] => Array(
[0] => 20160420085418
[1] => 111783178, 111557953, 111646835, 111413356, 111412662, 105618372, 111413557
)
[2] => Array(
[0] =>
[1] => 111413432, 111633904, 111783198, 111792767, 111557948, 111413225, 111413281
)
[3] => Array(
[0] =>
[1] => 111413432, 111633904, 111783198, 111792767, 111557948, 111413225, 111413281
)
[4] => Array(
[0] => 20160420085522
[1] => 111344871, 111394583, 111295547, 111379566, 111352520
)
[5] => Array(
[0] => 20160420090022
[1] => 111344871, 111394583, 111295547, 111379566, 111352520
)
)
解决方案
你可以尝试这样的方法:
<?php
$filename = "datesandids.log";
$rows = explode(PHP_EOL, file_get_contents($filename));
$result = Array();
foreach($rows as $key => $row){
$keyval = explode(':', $row);
$keyval[1] = str_replace('[', '', $keyval[1]);
$keyval[1] = str_replace(']', '', $keyval[1]);
$keyval[1] = explode(', ', trim($keyval[1]));
if(!isset($result[$keyval[0]])){
$result[$keyval[0]] = $keyval[1];
}else{
$result[$keyval[0]] = array_merge($result[$keyval[0]], $keyval[1]);
}
}
var_dump($result);
PHP 文档说:
PHP 中的数组实际上是一个有序映射。映射是将值与键相关联的类型。这种类型针对几种不同的用途进行了优化;它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。由于数组值可以是其他数组,因此树和多维数组也是可能的。
这样你就不用太担心重复了
此外,我建议您使用PHP_EOL 常量来爆炸您的文件,这样您就不会遇到其他系统的问题
输出将是这样的:
array(4){
[20160420084726]=> array(1) {
[0]=> string(1) "-"
}
[20160420085418]=> array(21) {
[0]=> string(9) "111783178"
.
.
[20]=> string(9) "111413281"
}
[20160420085522]=> array(5) {
[0]=> string(9) "111344871"
.
.
[4]=> string(9) "111352520"
}
[20160420090022]=> array(5) {
[0]=> string(9) "111344871"
.
.
[4]=> string(9) "111352520"
}
}
推荐阅读
- laravel - 我想使用 Boostrap 库来制作模态
- c# - 用户退出时将文件保存在本地应用程序文件夹中
- algorithm - 使用 Q 查询遍历图中的最后一个节点
- mysql - 订阅 MySQL 表,以便在截断、删除或更改时提醒我
- python - 安装octave后找不到octave.exe,它在哪里?
- java - 如果可能,递归检查将一个数组拆分为两个满足特定条件的数组
- java - 从较新的活动返回时如何触发旧活动上的功能?
- c# - Getter 和 Setter - “值”如何工作,尤其是在 if 语句中?
- android - 将对象设置为对象列表
- css - 无法平滑地为 flexbox-direction 设置动画