php脚本编写的两个txt文件之间的区别

时间:2018-01-17 21:07:12

标签: php sorting

我已经构建了这个脚本,它应该只保存唯一的行,在这种情况下是url的。每行一个url到.txt文件中。

在我的表单上,我只有一个值来自输入名称=“url”的“url”。

脚本工作,得到值,检查是否唯一,写入常量文件,然后我应用从A到Z的排序,并将排序的输出写入新的临时文件。以下是我想要提出的3件事,感谢任何帮助:

  1. 我不确定这是否是将排序写入新文件的正确方法,还是可以重写原始文件

  2. 临时文件在带有值的行之间用空行写入。无法从空行的来源中找出来。

  3. 最后一位是临时文件总是比常量文件少一行。

    <?php
    
    // config
    $url = $_GET['url'];
    $n = "\n";
    $data = $url . $n;
    $file = "datatest.txt"; // constant file
    $file2 = "datatest2.txt"; // temp file
    
    // check for duplicates & add new value if unique
    $unique_data = file_get_contents($file);
    if(strpos($unique_data, $data) === false){
    $fh = fopen($file, 'a') or die("Can't open the file");
    
    // chmod (optional)
    chmod($file,0666);
    chmod($file2,0666);
    
    // sort
    $lines = file($file);
    sort($lines);
    
    // write to original
    $record = file_put_contents($file, $data, FILE_APPEND | LOCK_EX);
    
    // write to temp
    $record2 = file_put_contents("$file2", implode("\n", $lines));
    
    }
    
    // testing echo the results
    if (empty($record)){
    echo "data already exists </br></br>";
    }else{
    echo $record . " bytes written to file </br></br>";
    echo $record2 . " bytes written to file2 </br></br>";
    }
    
    // display all (change file if needed)
    $fh = fopen($file, 'r');
    $pageText = fread($fh, 25000);
    
    echo nl2br($pageText);
    
    ?>
    
  4. 任何意见都表示赞赏。

    编辑:

    借助@Barmar的帮助,我成功地消除了积分2&amp; 3。

    <?php
    
    // config
    $url = $_GET['url'];
    $n = "\n";
    $data = $url . $n;
    $file = "temp.txt"; // temp file in local folder
    $file2 = "constant.txt"; // constant counterpart file
    
    // check for duplicates & add new value if unique
    $unique_data = file_get_contents($file);
    if(strpos($unique_data, $data) === false){
    
    $fh = fopen($file, 'a') or die("Can't open the file");
    
    // chmod (optional)
    chmod($file,0666);
    chmod($file2,0666);
    
    // write to original
    $record = file_put_contents($file, $data, FILE_APPEND | LOCK_EX);
    
    // sort
    $lines = file($file, FILE_IGNORE_NEW_LINES);
    sort($lines);
    
    // write to temp
    $record2 = file_put_contents($file2, implode("\n", $lines), LOCK_EX);
    
    }
    
    // testing echo the results
    if (empty($record)){
    echo "data already exists </br></br>";
    }else{
    echo $record . " bytes written to file </br></br>";
    echo $record2 . " bytes written to file2 </br></br>";
    }
    
    // display all (change file if needed)
    $fh = fopen($file2, 'r');
    $pageText = fread($fh, 25000);
    
    echo nl2br($pageText);
    
    ?>
    

    仍然无法弄清楚如何只使用一个文件。 @Barmar,我试图使用你的“in_array”,但它给了我一个错误。

1 个答案:

答案 0 :(得分:1)

  1. 是的,可以重写原始文件。只需使用一个始终排序的文件:

    $lines = file($file, FILE_IGNORE_NEW_LINES);
    if (in_array($url, $lines)) {
        $lines[] = $url;
        sort($lines);
        file_put_contents($file, implode("\n", $lines) . "\n");
    }
    
  2. 空行来自implode("\n", $lines),因为$lines中的字符串已经以换行符结尾。所以你要在它们之间添加第二个换行符。在上面的代码中,我使用FILE_IGNORE_NEW_LINES来阻止它将它们包含在字符串中。

  3. 我怀疑这与换行有关,但我不太确定。