首页 > 解决方案 > foreach() 在文件写入时添加空行

问题描述

我正在尝试从文件中读取和写入!该文件将始终以 6 行开头。默认设置文件如下所示:

10
50
255 255 255
0 255 0
0 255 0
0 255 0

我有一个默认设置文件和另一个当前设置文件,其中完成了读取和写入。

我正在使用 3 个全局声明的数组来读取和写入值:

$arrayInputs = array();
$arrayDefaults = array();
$arrayColorsHEX = array();

我从默认文件开始:

if(filesize($inputsFilePath)<=0) {
    if ($defaultSettingsFile) {
        // echo "<br>Reading from $defaultFilePath<br>";
        // Fill $arrayDefaults
        $arrayDefaults = explode(PHP_EOL, fread($defaultSettingsFile, filesize($defaultFilePath)));
        fclose($defaultSettingsFile);
        // Output $arrayDefaults
        var_dump($arrayDefaults);
        foreach ($arrayDefaults as $keyD => $valueD) {
            $arrayInputs[$keyD] = $arrayDefaults[$keyD];
        }
        var_dump($arrayInputs);
        $Timer = $arrayDefaults[0];
        $Brightness = $arrayDefaults[1];
        $arrayColorsHEX[0] = RGBtoHexadecimal($arrayDefaults[2]);
        $arrayColorsHEX[1] = RGBtoHexadecimal($arrayDefaults[3]);
        $arrayColorsHEX[2] = RGBtoHexadecimal($arrayDefaults[4]);
        $arrayColorsHEX[3] = RGBtoHexadecimal($arrayDefaults[5]);
    }
}

我填写$arrayDefaults$arrayInputs。因此,两个数组上的 var_dump 将如下所示:

/var/www/mysite/inputs.php:53:
array (size=7)
  0 => string '10' (length=2)
  1 => string '50' (length=2)
  2 => string '255 255 255' (length=11)
  3 => string '0 255 0' (length=7)
  4 => string '0 255 0' (length=7)
  5 => string '0 255 0' (length=7)
  6 => string '' (length=0)
/var/www/mysite/inputs.php:57:
array (size=7)
  0 => string '10' (length=2)
  1 => string '50' (length=2)
  2 => string '255 255 255' (length=11)
  3 => string '0 255 0' (length=7)
  4 => string '0 255 0' (length=7)
  5 => string '0 255 0' (length=7)
  6 => string '' (length=0)

我不喜欢它在数组中添加另一个空元素的事实,但我无法找到修复它的方法。

我继续使用当前的设置文件:

else {
    if($currentSettingsFile) {
        // echo "<br>Reading from $inputsFilePath<br>";
        // Fill $arrayInputs
        $arrayInputs = explode(PHP_EOL, fread($currentSettingsFile, filesize($inputsFilePath)));
        $closeFlag = fclose($currentSettingsFile);
        // Output/echo $arrayInputs
        // var_dump($arrayInputs);
        // $arrayLength = strlen($arrayInputs);
        $Timer = $arrayInputs[0];
        $Brightness = $arrayInputs[1];
        $n_1 = 0;
        foreach ($arrayInputs as $key1 => $value1) {
            $n_1 = $key1;
        }
        echo "<br>key1 = $n_1";
        if($n_1>1) {
            $i = 2;
            while(isset($arrayInputs[$i]) && $i<$n_1-1) {
                // echo "<br>arrayInputs[$i]= ".$arrayInputs[$i];
                $arrayColorsHEX[$i-2] = RGBtoHexadecimal($arrayInputs[$i]);
                // echo "<br>arrayColorsHEX[$i-2]".$arrayColorsHEX[$i-2];
                // echo "<br>i = $i";
                $i++;
                // echo "<br>END OF WHILE<br/>";
            }
        }
    } //if($currentSettingsFile)
}

然后我从 6 个帖子中获取我的价值观:

if(isset( $_POST['save_values'])) {

    if(!empty($_POST['getTimer'])) {
        $Timer = $_POST['getTimer'];
        $arrayInputs[0] = $Timer;
    }

    if(!empty($_POST['getBrightness'])) {
        $Brightness = $_POST['getBrightness'];
        $arrayInputs[1] = $Brightness;
    }
}

if(isset( $_POST['save_color1'])) {
    if(!empty($_POST['getColors1'])) {
        $arrayColorsHEX[0] = $_POST['getColors1'];
        // echo "<br>POSTarrayColorsHEX[0]= ".$arrayColorsHEX[0];
        $arrayInputs[2] = HexadecimalToRGB($arrayColorsHEX[0]);
        // echo "<br>arrayInputs[2]= ".$arrayInputs[2];
    }
}

if(isset( $_POST['save_color2'])) {
    if(!empty($_POST['getColors2'])) {
        $arrayColorsHEX[1] = $_POST['getColors2'];
        // echo "<br>arrayColorsHEX[1]= ".$arrayColorsHEX[1];
        $arrayInputs[3] = HexadecimalToRGB($arrayColorsHEX[1]);
        // echo "<br>arrayInputs[3]= ".$arrayInputs[3];
    }
}

if(isset( $_POST['save_color3'])) {
    if(!empty($_POST['getColors3'])) {
        $arrayColorsHEX[2] = $_POST['getColors3'];
        // echo "<br>arrayColorsHEX[2]= ".$arrayColorsHEX[2];
        $arrayInputs[4] = HexadecimalToRGB($arrayColorsHEX[2]);
        // echo "<br>arrayInputs[4]= ".$arrayInputs[4];
    }
}

if(isset( $_POST['save_color4'])) {
    if(!empty($_POST['getColors4'])) {
        $arrayColorsHEX[3] = $_POST['getColors4'];
        // echo "<br>arrayColorsHEX[3]= ".$arrayColorsHEX[3];
        $arrayInputs[5] = HexadecimalToRGB($arrayColorsHEX[3]);
        // echo "<br>arrayInputs[5]= ".$arrayInputs[5];
    }
}

最后我写在文件中:

if(!$closeFlag) fclose($currentSettingsFile);

$currentSettingsFile = fopen($inputsFilePath, "w");
if($currentSettingsFile) {
    // echo "<br>Writing in $inputsFilePath<br>";
    // var_dump($arrayInputs);
    foreach ($arrayInputs as $key2 => $value2) {
        fwrite($currentSettingsFile,$value2.PHP_EOL);
    }

    // for($k = 0; $k < $n_2; $k++) {
    //     fwrite($currentSettingsFile,$arrayInputs[$k].PHP_EOL);
    //     // echo "<br>arrayInputs[$k]= $arrayInputs[$k]";
    // }
        
    fclose($currentSettingsFile);
}

请注意,我尝试了 2 种写入文件的方法。

现在,问题是对于每次页面刷新,代码都会在文件中添加一个空行,在$arrayInputs. 还为每个POST.

我怎样才能解决这个问题 ?

标签: php

解决方案


您在最后一行之后添加 EOL。这就是explode返回 6 条记录的原因。

关闭文件后,内容看起来像这样(注意最后的 EOL)

line1 EOL line2 EOL line3 EOL line4 EOL line5 EOL line 6 EOL

您希望您的文件看起来像这样(最后没有任何 EOL):

line1 EOL line2 EOL line3 EOL line4 EOL line5 EOL line 6

要解决此问题,您可以尝试以下方法之一:

建议1:在爆炸前修剪文件内容:

换行

explode(PHP_EOL, fread($currentSettingsFile, filesize($inputsFilePath)));

explode(PHP_EOL, trim(fread($currentSettingsFile), filesize($inputsFilePath)));

建议2:修改for的写法,如下

foreach ($arrayInputs as $key2 => $value2) {
  if ($key2 != 0) {
    fwrite($currentSettingsFile,PHP_EOL);
  }
  fwrite($currentSettingsFile,$value2);
}

建议 3:使用 implode 写入文件,无需任何for

fwrite($currentSettingsFile, implode(PHP_EOL, $arrayInputs));

就个人而言,我会选择第三个建议。


推荐阅读