【问题标题】:Writing values to INI file将值写入 INI 文件
【发布时间】:2017-06-14 14:53:38
【问题描述】:

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

我喜欢并工作的解决方案位于:https://stackoverflow.com/a/36997282/6613233

我试图让它收集信息,然后将其推送到最后的文件中。我自己的尝试如下,但我一直在我的 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']);

每次都会覆盖文件,这在我看来简直是疯了!我的想法有点矫枉过正,显然有一些方法可以满足我的需要,所以我可以在制作编辑/更改列表后调用该函数一次,然后当我调用该函数时,它会抓取我所有更改的数据并以这种方式保存文件我要!

【问题讨论】:

    标签: php ini


    【解决方案1】:

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

    您的 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 类中以使其更好。 :)

    【讨论】:

    • 怕你这么说!从您编辑的部分,我从未说过“我得到了工作代码,我改变了它,现在它不再工作了。”但无论如何!所以对于我的裁判问题,我需要config_set("location.ini", "id", "value", $_POST['fbconfigid']);,然后在我的其他部分再做一次?或者有没有更好的方法使用他们的代码,但让它适用于我的场景?
    • 检查我上面编辑的问题,看看我多次调用该函数的意思。
    • 啊,现在我明白你的意思了。好吧,如果您分析 config_set,您会发现它做了 3 件事。第 1 行:将文件加载到数组中。第 2 行:设置值。下一行:编译 ini 文件内容。最后一行:将内容写入磁盘。在将文件写回磁盘之前,您当然可以将此功能分开并设置任意数量的项目。我将构建一个示例。
    • 哇,刚刚意识到我在做什么。 ._.我认为 foreach 与上述有关。今晚需要早点睡。感谢您帮助我重新查看该功能!在我深入研究之前,我需要停止发布问题。对不起,谢谢!
    • Np。同时,我在答案中添加了一堆函数。睡个好觉! :o)
    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 2010-11-19
    • 2015-09-17
    • 2017-03-07
    • 2014-01-31
    • 2014-03-22
    • 2013-05-21
    • 2017-02-21
    相关资源
    最近更新 更多