créer un fichier ini, écrire des valeurs en PHP

Je ne peux pas trouver un moyen qui me permette facilement de créer un nouveau fichier, le traiter comme un fichier ini (pas php.ini ou simiilar... un fichier ini séparé pour chaque utilisateur), et créer/supprimer des valeurs en utilisant PHP. PHP semble offrir aucun moyen facile de créer un fichier ini et de lire/écrire/supprimer des valeurs. Jusqu'à présent, tout n'est que "lire" - rien à propos de la création d'entrées ou de la manipulation de clés/valeurs.

43
demandé sur Dominic Rodger 2009-08-12 23:58:31

6 réponses

extrait de code trouvé dans les commentaires de la 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; 
}

Utilisation:

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

Bonne chance!

53
répondu Harri Siirak 2014-08-21 10:51:08

PEAR a deux paquets (testés à l'unité) qui font la tâche que vous attendez:

  • Config_Lite - idéal si vous ne voulez .ini fichiers
  • Config - lit aussi .php et .xml fichiers

je préfère utiliser du code bien testé que d'écrire le mien.

8
répondu cweiske 2011-04-18 10:54:18

Je ne peux pas me porter garant de la façon dont cela fonctionne, mais il y a quelques suggestions pour mettre en œuvre le contraire de parse_ini_file()(i.e. write_ini_file, qui n'est pas une fonction PHP standard) sur la page de documentation pour parse_ini_file.

Vous pouvez utiliser write_ini_file pour envoyer les valeurs d'un fichier, parse_ini_file à lire dans - de modifier le tableau associatif parse_ini_file retourne, puis renvoie le tableau modifié au fichier avec write_ini_file.

cela fonctionne pour vous?

7
répondu Dominic Rodger 2011-11-13 16:50:23

dans cette partie du 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 doit être remplacé par $key ou vous trouverez vide clés dans votre .ini

5
répondu mario-mesiti 2010-09-30 13:15:36

basé sur les réponses ci-dessus, j'ai écrit cette classe qui pourrait être utile. Pour PHP 5.3 mais peut être facilement adapté pour les versions précédentes.

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";
                }
            }
        }
    }
3
répondu Tivie 2013-10-21 21:15:57

je l'utiliser et il semble fonctionner

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

il renvoie le texte à écrire dans un .fichier ini

2
répondu user1123382 2012-01-27 20:39:46