使用php在for循环中编写文件



在foreach循环中编写文件时遇到了很多问题。它要么写入数组末尾的行,要么写入数组开头的行。

例如:

一个文件包含这样的元素,

page.php?id=1
page.php?id=3
page.php?id=4
investor.php?id=1&la=1
page.php?id=15
page.php?id=13
page.php?id=14

代码将打开此文件,然后使用=分隔符使用分解来分隔每个数组。并将返回这样的元素

page.php?id
page.php?id
page.php?id
investor.php?id
page.php?id
page.php?id
page.php?id

则它将使用array_ unique函数&然后将其保存在文件中。我有这个代码。请帮我

 $lines = file($fopen2);
    foreach($lines as $line)
    {
    $rfi_links = explode("=",$line);
    echo $array = $rfi_links[0];
    $save1 = $rfi.$file.$txt;
    $fp=fopen("$save1","w+");
    fwrite($fp,$array);
    fclose($fp);
    }
    $links_duplicate_removed = array_unique($array);
    print_r($links_duplicate_removed);

"w+"将在每次打开时创建一个新文件,擦除旧内容。

"a+"解决了这个问题,但最好在循环之前打开文件进行写入,然后关闭。

什么是没有意义的,是你总是将当前url写入该文件,同时覆盖其以前的内容。在foreach循环的每一步中,都要重新打开该文件,擦除其内容,并向该文件写入一个url。在下一步中,重新打开完全相同的文件,然后再次执行此操作。这就是为什么你最终只得到该文件中的最后一个url。

您需要收集一个数组中的所有URL,抛出重复的URL,然后将唯一的URL写入光盘:

$lines = file($fopen2);
$urls = array();                          // <-- create empty array for the urls
foreach ($lines as $line) {
    $rfi_links = explode('=', $line, 2);  // <-- you need only two parts, rights?
    $urls[] = $rfi_links[0];              // <-- push new URL to the array
}
// Remove duplicates from the array
$links_duplicate_removed = array_unique($urls);
// Write unique urls to the file:
file_put_contents($rfi.$file.$ext, implode(PHP_EOL, $links_duplicate_removed));

另一个解决方案(更受前一种方法的启发)是在开始迭代之前打开一次文件:

$lines = file($fopen2);
$urls = array();
// Open file
$fp = fopen($rfi.$file.$ext, 'w');
foreach ($lines as $line) {
    $rfi_url = explode('=', $line, 2);
    // check if that url is new
    if (!in_array($rfi_url[0], $urls)) {
        // it is new, so add it to the array (=mark it as "already occured")
        $urls[] = $rfi_url[0];
        // Write new url to the file
        fputs($fp, $rfi_url[0] . PHP_EOL);
    }
}
// Close the file
fclose($fp);

相关内容

  • 没有找到相关文章

最新更新