web-dev-qa-db-fra.com

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

Je ne peux pas trouver un moyen qui me permette facilement de créer un nouveau fichier, de le traiter comme un fichier ini (pas php.ini ou simiilar ... un fichier ini séparé pour par utilisateur), et de créer/supprimer des valeurs en utilisant PHP. PHP ne semble pas offrir un moyen facile de créer un fichier ini et de lire/écrire/supprimer des valeurs. Pour l'instant, tout est simplement "lu" - rien sur la création d'entrées ou la manipulation de clés/valeurs.

44
netrox

Extrait de code suivant 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; 
}

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

Bonne chance!

53
Harri Siirak

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

  • Config_Lite - idéal si vous voulez seulement .ini des dossiers
  • Config - lit également .php et .xml des dossiers

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

8
cweiske

Je ne peux pas garantir à quel point cela fonctionne, mais il y a quelques suggestions pour implémenter l'opposé de parse_ini_file() (c'est-à-dire write_ini_file, qui n'est pas un standard PHP) sur la page de documentation de parse_ini_file.

Vous pouvez utiliser write_ini_file pour envoyer les valeurs dans un fichier, parse_ini_file pour les relire - modifiez le tableau associatif que parse_ini_file renvoie, puis réécrivez le tableau modifié dans le fichier avec write_ini_file.

Est-ce que ça marche pour toi?

7
Dominic Rodger

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 sinon vous trouverez des clés vides dans votre .ini

5
mario-mesiti

sur la base des réponses ci-dessus, j'ai écrit ce cours 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
Tivie

J'utilise ça et ça semble marcher

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
user1123382