我将首先尝试解释为什么您的代码与其他代码相比不起作用。
您的 inifile-array 由嵌套数组 $array[section][item] = value 构建而成。第一个维度具有部分名称。第二个维度是部分中项目的名称。所以$fbsettingsDB["location"] 包含一个项目数组,其中"value" 是一个。
Implode 不检查数组是否嵌套。它只采用第一个维度(部分)并尝试将它们的值视为字符串。由于这些值实际上是项目数组,PHP 只是将其转换为文本“数组”。
除此之外,您不能只内爆整个数组。部分名称应该用方括号括起来,因此在这方面还有一些工作要做。
如果您检查the solution in the answer you referred to,您会看到它包含一个循环,该循环负责处理第一层,即部分。
每个section的item数组用implode单独转换,然后以方括号中的section名称作为前缀,整批追加到最终结果中。
因此,您的意图是:您不想设置一个值并立即将其写回文件,而是更新多个值并仅将最终结果写入磁盘。好吧,幸运的是,该函数不必是原子的。它已经执行了三个单独的操作:从磁盘加载、修改数据以及将其序列化回磁盘。让我们看看是否可以将它们隔离在单独的函数中:
读取数据。好吧,几乎不值得创建一个函数,但如果您在相关函数的集合中使用相同的命名等,它可能会使您的应用程序更加一致。
注意:我只是从头开始写的。手头没有可供测试的 PHP,因此它们可能包含轻微的语法错误。
原来是这样:
// Loads ini file data
function config_read($config_file) {
return parse_ini_file($config_file, true);
}
在加载的数据中设置配置。同样,几乎不值得拥有一个函数,但它增加了可读性并隐藏了 ini 文件数据的确切构建方式,因此您在使用它时不必担心实现细节。请注意,该数组是通过引用传递的。您指定的数组已更新。该函数不返回值。
// 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);
}
请注意,到目前为止,我没有修改任何代码。我只是将它包装在单独的函数中。如果您愿意,您甚至可以在另一个函数中调用这些函数,这样您仍然可以快速将所有内容一次写入磁盘。您将拥有原始功能,但没有重复代码:
// 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);
我可以想象您可以添加其他简写,例如 config_set_array_file,您可以像这样调用它。我将把它的实现留给您练习。 ;)
array_config_set_file($config_file, array(
"id" => $_POST['fbconfigid'],
"location" => $_POST['something'],
"result" => $_POST['somethingelse']));
然后,您可以将所有这些都放入 IniFile 类中以使其更好。 :)