44

新しいファイルを簡単に作成し、それをiniファイル(php.iniや類似の...ユーザーごとに個別のiniファイルではない)として扱い、PHPを使用して値を作成/削除する方法が見つかりません。PHPは、iniファイルを作成し、値を読み取り/書き込み/削除する簡単な方法を提供していないようです。これまでのところ、それはすべて「読み取り」であり、エントリの作成やキー/値の操作については何もありません。

4

6 に答える 6

54

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

使用法:

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

幸運を!

于 2009-08-12T20:45:46.450 に答える
7

それがどれだけうまく機能するかを保証することはできませんが、のドキュメントページにその反対parse_ini_file()(つまりwrite_ini_file、標準のPHP関数ではない)を実装するためのいくつかの提案がありますparse_ini_file

を使用write_ini_fileして、値をファイルに送信し、値をparse_ini_file読み戻すことができます。parse_ini_file返される連想配列を変更してから、変更した配列を。を使用してファイルに書き戻しますwrite_ini_file

それはあなたのために働きますか?

于 2009-08-12T20:08:40.203 に答える
7

PEARには、あなたが待ち望んでいたタスクを実行する2つの(単体テスト済みの)パッケージがあります。

  • Config_Lite-.iniファイルのみが必要な場合に最適
  • 構成.php-.xmlファイルも読み取ります

自分でコードを書くよりも、十分にテストされたコードを使用したいです。

于 2011-04-18T10:54:18.173 に答える
5

コードのこの部分:

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に空のキーが見つかります。

于 2010-09-30T13:15:36.263 に答える
3

上記の答えに基づいて、私は役に立つかもしれないこのクラスを書きました。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";
                }
            }
        }
    }
于 2012-03-02T00:27:13.293 に答える
2

私はこれを使用し、それはうまくいくようです

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ファイルに書き込むテキストを返します

于 2012-01-27T20:06:36.517 に答える