php 创建ini文件,在PHP中写入值

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1268378/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 01:49:09  来源:igfitidea点击:

create ini file, write values in PHP

phpconfigurationini

提问by netrox

I cannot find a way that easily lets me create a new file, treat it as an ini file (not php.ini or simiilar... a separate ini file for per user), and create/delete values using PHP. PHP seems to offer no easy way to create an ini file and read/write/delete values. So far, it's all just "read" - nothing about creating entries or manipulating keys/values.

我找不到一种方法可以轻松地让我创建一个新文件,将其视为一个 ini 文件(不是 php.ini 或类似...每个用户的单独 ini 文件),并使用 PHP 创建/删除值。PHP 似乎没有提供创建 ini 文件和读/写/删除值的简单方法。到目前为止,一切都只是“阅读”——与创建条目或操作键/值无关。

回答by Harri Siirak

Found following code snippet from the comments of the PHP documentation:

从 PHP 文档的注释中找到以下代码片段:

function write_ini_file($assoc_arr, $path, $has_sections=FALSE) { 
    $content = ""; 
    if ($has_sections) { 
        foreach ($assoc_arr as $key=>$elem) { 
            $content .= "[".$key."]\n"; 
            foreach ($elem as $key2=>$elem2) { 
                if(is_array($elem2)) 
                { 
                    for($i=0;$i<count($elem2);$i++) 
                    { 
                        $content .= $key2."[] = \"".$elem2[$i]."\"\n"; 
                    } 
                } 
                else if($elem2=="") $content .= $key2." = \n"; 
                else $content .= $key2." = \"".$elem2."\"\n"; 
            } 
        } 
    } 
    else { 
        foreach ($assoc_arr as $key=>$elem) { 
            if(is_array($elem)) 
            { 
                for($i=0;$i<count($elem);$i++) 
                { 
                    $content .= $key."[] = \"".$elem[$i]."\"\n"; 
                } 
            } 
            else if($elem=="") $content .= $key." = \n"; 
            else $content .= $key." = \"".$elem."\"\n"; 
        } 
    } 

    if (!$handle = fopen($path, 'w')) { 
        return false; 
    }

    $success = fwrite($handle, $content);
    fclose($handle); 

    return $success; 
}

Usage:

用法:

$sampleData = array(
                'first' => array(
                    'first-1' => 1,
                    'first-2' => 2,
                    'first-3' => 3,
                    'first-4' => 4,
                    'first-5' => 5,
                ),
                'second' => array(
                    'second-1' => 1,
                    'second-2' => 2,
                    'second-3' => 3,
                    'second-4' => 4,
                    'second-5' => 5,
                ));
write_ini_file($sampleData, './data.ini', true);

Good luck!

祝你好运!

回答by Dominic Rodger

I can't vouch for how well it works, but there's some suggestions for implementing the opposite of parse_ini_file()(i.e. write_ini_file, which isn't a standard PHP function) on the documentation page for parse_ini_file.

我不能保证它如何运作,但有执行的相反一些建议parse_ini_file()(即write_ini_file用于文档的页面上,这是不是一个标准的PHP函数)parse_ini_file

You can use write_ini_fileto send the values to a file, parse_ini_fileto read them back in - modify the associative array that parse_ini_filereturns, and then write the modified array back to the file with write_ini_file.

您可以使用write_ini_file将值发送到文件,parse_ini_file将它们读回 - 修改parse_ini_file返回的关联数组,然后将修改后的数组写回文件write_ini_file

Does that work for you?

那对你有用吗?

回答by cweiske

PEAR has two (unit tested) packages which do the task you are longing for:

PEAR 有两个(经过单元测试的)包可以完成您渴望的任务:

  • Config_Lite- 如果您只需要.ini文件,则是理想之选
  • 配置- 也读取.php.xml文件

I'd rather use well tested code than writing my own.

我宁愿使用经过良好测试的代码而不是自己编写代码。

回答by mario-mesiti

in this portion of code:

在这部分代码中:

else { 
    foreach ($assoc_arr as $key=>$elem) { 
        if(is_array($elem)) 
        { 
            for($i=0;$i<count($elem);$i++) 
            { 
                $content .= $key2."[] = \"".$elem[$i]."\"\n"; 
            } 
        } 
        else if($elem=="") $content .= $key2." = \n"; 
        else $content .= $key2." = \"".$elem."\"\n"; 
    } 
} 

$key2 must be replaced by $key or you would find empty keys in your .ini

$key2 必须由 $key 替换,否则您会在 .ini 中找到空键

回答by Tivie

based on the above answers I wrote this class that might be useful. For PHP 5.3 but can be easily adapted for previous versions.

基于上述答案,我编写了可能有用的课程。适用于 PHP 5.3 但可以轻松适应以前的版本。

class Utils
    {
        public static function write_ini_file($assoc_arr, $path, $has_sections)
        {
            $content = '';

            if (!$handle = fopen($path, 'w'))
                return FALSE;

            self::_write_ini_file_r($content, $assoc_arr, $has_sections);

            if (!fwrite($handle, $content))
                return FALSE;

            fclose($handle);
            return TRUE;
        }

        private static function _write_ini_file_r(&$content, $assoc_arr, $has_sections)
        {
            foreach ($assoc_arr as $key => $val) {
                if (is_array($val)) {
                    if($has_sections) {
                        $content .= "[$key]\n";
                        self::_write_ini_file_r(&$content, $val, false);
                    } else {
                        foreach($val as $iKey => $iVal) {
                            if (is_int($iKey))
                                $content .= $key ."[] = $iVal\n";
                            else
                                $content .= $key ."[$iKey] = $iVal\n";
                        }
                    }
                } else {
                    $content .= "$key = $val\n";
                }
            }
        }
    }

回答by user1123382

I use this and it seems to work

我用这个,它似乎工作

function listINIRecursive($array_name, $indent = 0)
{
    global $str;
    foreach ($array_name as $k => $v)
    {
        if (is_array($v))
        {
            for ($i=0; $i < $indent * 5; $i++){ $str.= " "; }
            $str.= " [$k] \r\n";
            listINIRecursive($v, $indent + 1);
        }
            else
        {
            for ($i=0; $i < $indent * 5; $i++){ $str.= " "; }
            $str.= "$k = $v \r\n";
        }
    }
 }

it returns the text to write to an .ini file

它返回要写入 .ini 文件的文本