将值写入 INI 文件

Writing values to INI file

我正在尝试存储多个数据,然后在最后将数据推送到新的 .ini 文件中。我找到了可行的解决方案,但我想先获取所有数据,然后在最后更新文件,但我找到的解决方案会立即更新文件!

我喜欢并工作的解决方案位于:

我试图让它收集信息,然后将其推送到最后的文件中。下面是我自己的尝试,但我一直在我的 ini 文件中获取数组数组。

代码:

$fbsettingsDB = parse_ini_file("location.ini", true);
$fbsettingsDB["id"]["value"] = $_POST['fbconfigid'];
$fbsettingsDB["location"]["value"] = $_POST['fbconfigcty'];
file_put_contents('location.ini', implode("\n", $fbsettingsDB));

以上是我想收集数据的方式。我有一堆代码进出语句,我希望它继续。分配所需的值,最后继续并将内容放入文件中,如上所示。

使用引用的代码我将不得不做:

config_set("location.ini", "id", "value", $_POST['fbconfigid']);
config_set("location.ini", "location", "value", $_POST['something']);
config_set("location.ini", "result", "value", $_POST['somethingelse']);

每次都覆盖文件,我认为这太疯狂了!对我的想法来说太过分了,显然有一些方法可以满足我的需要所以我可以在列出 edit/changes 之后调用一次函数然后当我调用函数时它会获取我所有更改的数据并保存文件我想要的方式!

我将首先尝试解释为什么您的代码与其他代码相比不起作用。

您的 inifile 数组由嵌套数组组成,$array[section][item] = value。第一个维度具有部分名称。第二个维度是部分中项目的名称。所以 $fbsettingsDB["location"] 包含一个项目数组,其中 "value" 是一个。

Iplode 不检查数组是否嵌套。它只采用第一个维度(部分)并尝试将它们的值视为字符串。由于这些值实际上是项目数组,PHP 只是将其转换为文本 'array'.

除此之外,你不能只是内爆整个阵列。部分名称应括在方括号中,因此在这方面还有一些工作要做。

如果您检查 the solution in the answer you referred to,您会看到它包含一个循环,负责处理第一层,即部分。 每个部分的项目数组分别用implode转换,然后在方括号中加上部分名称作为前缀,并将整批附加到最终结果。

所以,您的意图是:您不想设置一个值并立即将其写回文件,而是更新多个值并且只将最终结果写入磁盘。好吧,幸运的是函数不必是原子的。它已经执行了三个独立的操作:从磁盘加载、修改数据以及将其序列化回磁盘。让我们看看是否可以将它们隔离在单独的函数中:

读取数据。好吧,几乎不值得创建一个函数,但是如果您在相关函数的集合中使用相同的命名等,它可能会使您的应用程序更加一致。

注意:我只是从头开始写这些。手头没有 PHP 可以测试,因此它们可能包含轻微的语法错误。

所以这里是:

// Loads ini file data
function config_read($config_file) {
    return parse_ini_file($config_file, true);
}

正在加载的数据中设置配置。同样,几乎不值得拥有一个函数,但它增加了可读性并隐藏了 ini 文件数据的确切构建方式,因此您在使用它时不必担心实现细节。请注意,数组是通过引用传递的。您指定的数组已更新。该函数没有 return 值。

// Update a setting in loaded inifile data
function config_set(&$config_data, $section, $key, $value) {
    $config_data[$section][$key] = $value;
}

然后写:

// Serializes inifile config data back to disk.
function config_write($config_data, $config_file) {
    $new_content = '';
    foreach ($config_data as $section => $section_content) {
        $section_content = array_map(function($value, $key) {
            return "$key=$value";
        }, array_values($section_content), array_keys($section_content));
        $section_content = implode("\n", $section_content);
        $new_content .= "[$section]\n$section_content\n";
    }
    file_put_contents($config_file, $new_content);
}

请注意,到目前为止我没有修改任何代码。我只是将它包装在单独的函数中。如果愿意,您甚至可以在另一个函数中调用这些函数,所以您仍然可以使用 shorthand 将所有内容一次写入磁盘。您将拥有原始功能,但没有重复代码:

// Short-hand function for updating a single config value in a file.
function config_set_file($config_file, $section, $key, $value) {
    $config_data = config_read($config_file);
    config_set($config_data, $section, $key, $value)
    config_write($config_file, $section, $key, $value);
}

所以,现在你得到了这个功能集合,你可以根据情况决定使用哪个。如果只想更新单个值,不妨这样写:

config_set_file("location.ini", "id", "value", $_POST['fbconfigid']);

但是如果你有多个配置要设置,你可以这样做:

// Load
$config_data = config_read("location.ini");
// Set multiple values
config_set($config_data, "id", "value", $_POST['fbconfigid']);
config_set($config_data, "location", "value", $_POST['something']);
config_set($config_data, "result", "value", $_POST['somethingelse']);
// Save
config_write($config_data, $config_file);

我可以想象你可以添加其他 shorthand,比如 config_set_array_file,你可以这样调用它。我将把这个实现留给你练习。 ;)

array_config_set_file($config_file, array(
    "id" => $_POST['fbconfigid'],
    "location" => $_POST['something'],
    "result" => $_POST['somethingelse']));

然后,您可以将所有这些都合并到一个 IniFile class 中以使其变得更好。 :)