Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP从文本文件中复制特定单词并将其附加到特定行_Php - Fatal编程技术网

PHP从文本文件中复制特定单词并将其附加到特定行

PHP从文本文件中复制特定单词并将其附加到特定行,php,Php,我有一个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%

我有一个
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;
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
基本上,在前三行中,末尾的时间戳是相同的,在接下来的三行中,末尾的时间戳是相同的,等等。我想在每行的末尾得到的是复制第二个时间戳并将其附加到前三行中,获得第三个时间戳并将其附加到接下来的三行中,依此类推。最后,要获得此输出,请执行以下操作:

 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;
[编辑]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);
$t=time();
$myfile1=fopen(“temp/time.txt”,“w”);
对于($i=0;$i$第一页){
$final_array[]=$first_page.'.$second_page_array[$key].'.$ranks_array[$key].'.$time_array[$key].“\n”;
}
文件内容('output.txt',$final_数组,文件附加| LOCK_EX);

您没有给我们提供太多信息;不过,我会试一试

我假设您已经将文本文件写入字符串并将其清除(修剪)。我们从那里开始

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;
}
您可能只需一步就可以做到这一点。我把它分成两部分来解释

现在您应该有一个如下所示的数组:

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;
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];
    }
}
foreach($key=>$value形式的元素){
如果(count($value)<6){//,因为您将只有5或6个值
$k=$array\u search($value,$uniqueTimestamps);
$k=$k+1;//也就是说,$k++……我又在写这本长手稿了
//将1添加到$k将为您提供唯一数组中的下一个时间戳
$elements[$key][]=$uniqueTimestamps[$k];
}
}
最后,遍历$elements数组并将所有内容内爆回$finalString,然后将其覆盖到文件中


我没有测试代码。如果您有任何问题,请告诉我。

您可以使用正则表达式捕获字符串的不同部分,并将其构建在一个循环中。
正则表达式将前三个项作为一个组捕获,然后将下面的项作为一个组捕获

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);

如果以后在文件中附加更多项目,也可以使用此功能。

编辑我看到您已编辑了问题,以包含更多代码。
此方法应与file_get_内容一起使用,而不是fopen,因为它需要一个项目中的完整字符串而不是数组。

这也意味着它比fopen-and-explode方法执行的循环要少得多。

您的代码是否会在每次操作后添加文本写入文件?或者文本保存在一次写入的缓冲区中?@Yeti82每次添加到文件中后,它都会保存在缓冲区中。使用PHP绝对可以做到这一点。你到底在哪里遇到了麻烦?你能把写在你文件中的代码添加到你的问题中吗?了解字符串的组成方式以及如何写入文件可能会很有用。根据这些因素,解决方案可能会有所不同。我解释说,根据文件的编写方式和字符串的组成方式,您可以在将字符串写入文件之前尝试添加所需的信息。您需要的是一个支持变量,用于在写入信息之前保存信息。@Yeti82是的,很抱歉我编辑了它。完全忘记;(@Rulli Smith无论发生什么,请告诉我。我现在的位置是5…4…的周末开始…但我会继续跟进,因为我不会为这些事情做任何事情。享受周末。