【问题标题】:create ini file, write values in PHP创建ini文件,在PHP中写入值
【发布时间】:2010-11-19 02:18:56
【问题描述】:

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

【问题讨论】:

  • 当您说“每个用户”时,您是什么意思?每次使用 PHP 应用程序?
  • 为什么每个用户都需要一个 .ini 文件?这种类型的信息不应该存储在数据库中吗?
  • @netrox,我认为 Peter Bailey 理解了您所说的用户的意思 - 主机上的用户名(用户名 apache 在其下运行或其他),或者您的应用程序的最终用户(即在浏览器中访问它的人)?
  • 顺便说一句 - 欢迎来到 stackoverflow.com - 第一个问题很好!
  • 如果必须将其存储在文件或其他单字段字符串中 - 您可能需要考虑使用 JSON:json_encodejson_decode。更灵活(布尔值、整数、数组、对象等)和移动性更强(现在许多语言都有 JSON 编码器/解码器)。

标签: php configuration ini


【解决方案1】:

从 PHP 文档的 cmets 中找到以下代码 sn-p:

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; 
}

用法:

$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);

祝你好运!

【讨论】:

  • if (!fwrite($handle, $content)) {之后,文件句柄应该被关闭。
  • 另外在不使用section的时候代码有错误,变量$key2应该是$key
  • 这不是官方解决方案,只是您的评论不是堆栈溢出的官方评论。
  • @MartinKonecny 是否暗示非官方解决方案中的错误是可以的?
  • @TomášZato 不,这意味着他不应该说这是官方代码。据我所知,这可能是错误的。他从 cmets 部分抓起它。
【解决方案2】:

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

  • Config_Lite - 如果您只想要 .ini 文件,这是理想的选择
  • Config - 还读取 .php.xml 文件

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

【讨论】:

    【解决方案3】:

    我不能保证它工作得有多好,但是在parse_ini_file 的文档页面上,有一些建议可以实现与parse_ini_file()(即write_ini_file,它不是标准的PHP 函数)相反的功能。

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

    这对你有用吗?

    【讨论】:

      【解决方案4】:

      在这部分代码中:

      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 必须替换为 $key 否则你会在你的 .ini 文件中找到空键

      【讨论】:

        【解决方案5】:

        基于上述答案,我编写了这个可能有用的课程。适用于 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";
                        }
                    }
                }
            }
        

        【讨论】:

        • 从 PHP7 开始,这行 self::_write_ini_file_r(&amp;$content, $val, false) 应该是 self::_write_ini_file_r($content, $val, false)
        【解决方案6】:

        我用这个,它似乎可以工作

        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";
                }
            }
         }
        

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

        【讨论】:

        • 如果 $array_name 内部包含多维数组,您的 sn-p 将失败。也就是说,如果父数组的深度为 3 或更大。
        猜你喜欢
        • 2017-03-07
        • 1970-01-01
        • 2017-03-07
        • 1970-01-01
        • 2014-10-23
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        • 2016-03-05
        相关资源
        最近更新 更多