Hello,
Zeigst du uns den Code?
Hier schon mal das Testscript:
<?php ### parse_ini_file.php ### Ini-File auslesen ### utf-8 ### ÄÖÜäöü
### only for testing
header('Content-Type: text/html; Charset=utf-8');
$source = 'ini_file.dat'; ## Dateiname für die Datendatei
$target = 'ini_file.write.dat'; ## Dateiname für die Ausgabe
$fs = @fopen($source, 'rb+');
$ft = @fopen($target, 'wb+');
#===================================================================================================
function ini_read($fp)
{
if (!$fp) return false;
if (!@flock($fp, LOCK_EX)) return false;
if (false === ($_fstat = @fstat($fp))) return false;
if (false === ($cont = fread($fp, $_fstat['size']))) return false;
if (false === ($_data = @parse_ini_string($cont, true))) return false;
return $_data;
}
#===================================================================================================
function writeparams($_values, $arraykey, $depth, $fp, $maxdepth)
{
foreach ($_values as $key => $param)
{
if ($depth >= 1)
{
$arraykeytxt = $arraykey . "[$key]";
}
else
{
$arraykeytxt = $key;
}
if (is_array($param))
{
$depth++;
if ($depth <= $maxdepth)
{
writeparams ($param, $arraykeytxt, $depth, $fp, $maxdepth);
}
}
else
{
fwrite ($fp, "$arraykeytxt = '$param'" . PHP_EOL);
}
}
return true;
}
#===================================================================================================
function ini_write($fp, $_data, $filename, $maxdepth=3)
{
#---------------------------------------------------------------------------
$writeparams = function ($_values, $arraykey, $depth) use ($fp, $maxdepth, &$writeparams)
{
foreach ($_values as $key => $param)
{
if ($depth >= 1)
{
$arraykeytxt = $arraykey . "[$key]";
}
else
{
$arraykeytxt = $key;
}
if (is_array($param))
{
$depth++;
if ($depth <= $maxdepth)
{
$writeparams ($param, $arraykeytxt, $depth);
}
}
else
{
fwrite ($fp, "$arraykeytxt = '$param'" . PHP_EOL);
}
}
return true;
};
#---------------------------------------------------------------------------
$depth = 0;
$arraykey = '';
foreach ($_data as $section => $_value)
{
if (is_array($_value))
{
fwrite ($fp, PHP_EOL . "[$section]" . PHP_EOL);
if ($depth < $maxdepth)
{
$writeparams ($_value, $_value, $depth);
# writeparams ($_value, $section, $depth, $fp, $maxdepth);
}
}
else
{
fwrite ($fp, "$section = '$_value'" . PHP_EOL);
}
}
}
#==================================================================================================
echo "<pre>\r\n";
if (false === ($_data = ini_read($fs))) echo htmlspecialchars(print_r(error_get_last(),1)) . "\r\n";
else
{
echo htmlspecialchars(print_r($_data,1)) . "\r\n";
ini_write($ft, $_data, $target, 3);
}
echo "</pre>\r\n";
?>
und die Source-Datei:
;### ini_file.dat ### 2014-05-18 13:46:34 ### utf-8 ### ÄÖÜäöü
param1 = eins
param2 = zwei
param3 = drei
[meta]
calls = 9
[active]
0 = braun
1 = rot
2 = grau
3 = blau
4 = violett
5 = grün
6 = orange
7 = gold
[reserve]
0 = weiß
1 = silber
2 = schwarz
3 = gelb
[tom]
alter = 56
wohnung[plz] = 34444
wohnung[ort] = 'Sankt Andreasberg'
wohnung[strasse] = 'Mühlenstraße'
wohnung[hausnummer] = 19
;comm[tel][] = '05582/999378' ; geht nicht, nur eine Array-Tiefe erlaubt
;comm[tel][] = '05582/999362' ; geht nicht, nur eine Array-Tiefe erlaubt
tel[] = '05582/999378'
tel[] = '05582/999362'
Man muss umschalten zwichen der Funktion writeparams() und der Closure $writeparams und sich die Zieldateien ansehen.
Ich würde mich freuen, wenn es nur ein Trivialfehler wäre.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg