我有PHP
执行一些文本操作来保存用户输入并获取此unix时间戳并将它们保存在文本文件中,最后文件如下所示:
1;0%;5%;4;1527085890;
1;15%;0%;1;1527085890;
1;20%;0%;2;1527085890;
2;5%;2%;3;1527085901;
2;20%;0%;1;1527085901;
2;2%;0%;2;1527085901;
3;2%;0%;5;1527085912;
3;20%;0%;1;1527085912;
3;3%;0%;2;1527085912;
基本上在前三行中,最后的时间戳是相同的,在接下来的三行中,最后的时间戳是相同的等等。我想在每一行的末尾得到的是复制第二行时间戳并将其附加到前三行,获取第三个时间戳并将其附加到接下来的三行,依此类推。最后得到这个输出:
1;0%;5%;4;1527085890;1527085901;
1;15%;0%;1;1527085890;1527085901;
1;20%;0%;2;1527085890;1527085901;
2;5%;2%;3;1527085901;1527085912;
2;20%;0%;1;1527085901;1527085912;
2;2%;0%;2;1527085901;1527085912;
3;2%;0%;5;1527085912;
3;20%;0%;1;1527085912;
3;3%;0%;2;1527085912;
[EDITED] PHP://在示例输出上我缩短了一些东西
$t=time();
$myfile1 = fopen("temp/time.txt", "w");
for ($i = 0; $i <= 5; $i++) {
fwrite($myfile1, $t.";\n");
}
$ranks = fopen("temp/ranks.txt", "w");
$selected_val = $_POST['rank1'].";\n".$_POST['rank2'].";\n".$_POST['rank3'].";\n".$_POST['rank4'].";\n".$_POST['rank5'].";\n".$_POST['rank6'].";";
fwrite($ranks, $selected_val);
$ranks_array = file("temp/ranks.txt",FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$time_array = file("temp/time.txt",FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$first_page_array = file("temp/userID.txt",FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$second_page_array = file("data/data1.txt",FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$final_array = [];
foreach($first_page_array as $key=>$first_page){
$final_array[] = $first_page.''.$second_page_array[$key].''.$ranks_array[$key].''.$time_array[$key]."\n";
}
file_put_contents('output.txt',$final_array, FILE_APPEND | LOCK_EX);
答案 0 :(得分:1)
您可以使用正则表达式捕获字符串的不同部分并在一个循环中构建它 正则表达式将前三个项目作为一个组捕获,然后将每个项目作为一个组合。
Preg_match_all("/(.*?;.*?;.*?;.*?;)(.*?);(.*?)/", $str, $matches);
Foreach($matches[1] as $key => $match){
If(isset($matches[2][$key+3])){
$temp = $matches[2][$key+3] . ";";
}Else{
$temp = "";
}
$res[] = $matches[1][$key] . $matches[2][$key] . ";" . $temp;
}
Echo implode(PHP_EOL, $res);
https://3v4l.org/Nrq15
如果您稍后将文件附加到更多项目,它也可以使用
https://3v4l.org/s1NKS
编辑我看到您已编辑了问题以包含更多代码
此方法应与file_get_contents一起使用,而不是fopen,因为它需要一个项目中的完整字符串而不是数组。
这也意味着它比fopen和爆炸方法做的循环少得多。
答案 1 :(得分:0)
你没有给我们太多的信息;但是,我会放手一搏。
我假设您已将文本文件写入字符串并清理(修剪)。我们将从那里开始。
1;0%;5%;4;1527085890;
1;15%;0%;1;1527085890;
1;20%;0%;2;1527085890;
2;5%;2%;3;1527085901;
2;20%;0%;1;1527085901;
2;2%;0%;2;1527085901;
3;2%;0%;5;1527085912;
3;20%;0%;1;1527085912;
3;3%;0%;2;1527085912;
首先,将你的工作字符串分解为一个工作数组,围绕你的换行符:$working = explode("\n",$workingString);
(假设一个名为“\ n”的换行符)
其次,遍历新数组并将其分解为子数组:
foreach($working as $values){
$subvalues = explode(";",$values);
$elements[] = $subvalues;
}
您可以一步完成此操作。我把它分成两个来解释。
现在你应该有一个如下所示的数组:
array $elements =
[0] => array [0] => 1
[1] => 0%
[2] => 5%
[3] => 4
[4] => 1527085890
[1] => array [0] => 1
[1] => 15%
[2] => 0%
[3] => 1
[4] => 1527085890
[2] => array [0] => 1
[1] => 20%
[2] => 0%
[3] => 2
[4] => 1527085890
[3] => array [0] => 2
[1] => 5%
[2] => 2%
[3] => 3
[4] => 1527085901
[4] => array [0] => 2
[1] => 20%
[2] => 0%
[3] => 1
[4] => 1527085901
[5] => array [0] => 2
[1] => 2%
[2] => 0%
[3] => 2
[4] => 1527085901
[6] => array [0] => 3
[1] => 2%
[2] => 0%
[3] => 5
[4] => 1527085912
接下来,遍历这个新数组以获取唯一时间戳的数组:
foreach($elements as $value){
if(!in_array($value[4],$uniqueTimestamps)){
$uniqueTimestamps[] = $value[4]
}
看看我要去哪里?
您的最终演练会将第二个时间戳添加到任何缺少它的子阵列中:
foreach($elements as $key => $value){
if(count($value) < 6){ // because you will only ever have 5 or 6 values
$k = $array_search($value,$uniqueTimestamps);
$k = $k + 1; // i.e. $k++... again, I'm writing this long-hand
// adding 1 to $k gives you the next timestamp in the unique array
$elements[$key][] = $uniqueTimestamps[$k];
}
}
要完成,请遍历您的$ elements数组并将所有内容重新包含回$ finalString,然后将其覆盖到您的文件中。
我没有测试代码。如果您有任何问题,请告诉我。