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.
-
1when you say "per user", what do you mean? Per use of the PHP application? – Peter Bailey Aug 12 '09 at 20:02
-
1why do you need an .ini file per user? shouldn't that type of information be stored in a DB? – Omnipresent Aug 12 '09 at 20:09
-
well, i meant that i want an ini file set for each user of the same PHP application. For example, chad.ini, jeff.ini, mary.ini, anne.ini – netrox Aug 12 '09 at 20:10
-
1@netrox, I think Peter Bailey's getting at what you mean by user - the username on the host machine (the username apache's running under or whatever), or the end-user of your application (i.e. the person accessing it in a browser)? – Dominic Rodger Aug 12 '09 at 20:12
-
1btw - welcome to stackoverflow.com - great first question! – Dominic Rodger Aug 12 '09 at 20:13
-
It's true, there are no built in functions for writing ini files, although the syntax is quite simple and it wouldn't take much to write a function to help with that. I suppose php's philosophy is that ini files are for humans to write. You might want to check out the write_ini_file function left in the comments here: http://us3.php.net/manual/en/function.parse-ini-file.php – camomileCase Aug 12 '09 at 20:17
-
You really should be storing per user data in a database. It is faster and much more scaleable. Unless this app is for only 5 or 10 people you are really shooting yourself in the foot by not doing the work to make it database driven. heck even windows uses a database for what it used to use .ini files for (called the registry now ;) ) – Byron Whitlock Aug 12 '09 at 20:40
-
2If must store it in a file, or other single-field string - You may want to consider using JSON instead: [`json_encode`](http://php.net/manual/en/function.json-encode.php), [`json_decode`](http://php.net/manual/en/function.json-decode.php). More flexible (booleans, integers, arrays, objects etc.) and very mobile (many languages have JSON encoders/decoders nowadays). – Timo Tijhof May 06 '12 at 18:28
-
https://stackoverflow.com/a/36997282/285594 – Sep 07 '17 at 13:21
6 Answers
Found following code snippet from the comments of the PHP documentation:
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!

- 9,688
- 11
- 84
- 127

- 1,182
- 12
- 15
-
10After `if (!fwrite($handle, $content)) {`, the file handle should be closed. – Dave Jarvis Apr 11 '10 at 22:42
-
5Also there's an error in the code when not using sections, the variable $key2 should be $key – kjetilh Jun 22 '12 at 11:07
-
This isn't an official solution just how your comment isn't an official comment of stack overflow. – Martin Konecny May 07 '13 at 20:42
-
@MartinKonecny does that imply that errors are fine in unoficial solutions? – Tomáš Zato Sep 18 '13 at 19:21
-
@TomášZato No it means he shouldn't say it's official code. It could be buggy for all I know. He grabbed it from the comments section. – Martin Konecny Sep 18 '13 at 23:43
-
Sorry, I did not understand context of your comment properly the first time. Thank you for making it clear for me. – Tomáš Zato Sep 19 '13 at 00:28
-
Downvote. While the answer is helpful, it really would be better if the author would fix the bug in the code. – Erik Hermansen Jul 09 '14 at 20:07
-
It's nice, but when we write this to file we will loose all comments. – Harikrishnan Aug 21 '14 at 10:58
-
Just wonder, if I only want to modify single value, do I have to write while file again? say I have array of ini file. $config = parse_ini_file($file, true); $config['ABC.menu']['title'] = "New title"; ..... cant I just change one value ? – extjs user Jan 04 '18 at 09:24
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
.
You can use write_ini_file
to send the values to a file, parse_ini_file
to read them back in - modify the associative array that parse_ini_file
returns, and then write the modified array back to the file with write_ini_file
.
Does that work for you?

- 83,810
- 28
- 209
- 234

- 97,747
- 36
- 197
- 212
PEAR has two (unit tested) packages which do the task you are longing for:
- Config_Lite - ideal if you only want
.ini
files - Config - reads also
.php
and.xml
files
I'd rather use well tested code than writing my own.

- 30,033
- 14
- 133
- 194
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

- 124
- 1
- 3
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.
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";
}
}
}
}

- 18,864
- 5
- 58
- 77
-
As of PHP7 this line `self::_write_ini_file_r(&$content, $val, false)` should be `self::_write_ini_file_r($content, $val, false)` – DDS Nov 10 '20 at 09:18
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

- 120
- 6
-
2Your snippet fails if $array_name contains a multi-dimensional array inside. That is, if the parent array has a depth of 3 or more. – Tivie Mar 02 '12 at 00:20