Rekursiven Array als Code darstellen
Rainer W.
- php
0 dedlfix
0 Rainer W.1 Daniel0 rodney rehm
Hi,
ich halte Konfigdaten nicht einer INI- oder XML-Datei, sondern in einem PHP-Script, das nur solche Daten enthält. Das sieht z.B. so aus (Keynamen hier nur "abstrakt"):
$cfg['abc']['dfkle'] = "Wert";
$cfg['abc']['ilk'] = "Wert";
$cfg['abc']['tiouid'] = "Wert";
$cfg['defg']['roitzf'] = "Wert";
$cfg['defg']['dflfgzhj'] = "Wert";
$cfg['defg']['dflfgzhj']['eroiut'] = "Wert";
$cfg['hijklm']['erior'] = "Wert";
$cfg['hijklm']['dfkf'] = "Wert";
$cfg['hijklm']['dfkf']['rotfklgf'] = "Wert";
Ein verschachtelter Array also. In PHP genügt es, die Konfigdatei zu inkludieren, und der Array $cfg steht sofort zur Verfügung. Nun soll unter anderem aber die Konfiguration geändert und zurückgeschrieben werden. Das Ändern ist ja kein Problem, aber um den geänderten Array aus dem Arbeitsspeicher in die PHP-Konfigdatei zurückzuschreiben muß ja z.B. aus $cfg['hijklm']['dfkf']['rotfklgf'] ein String wie "$cfg['hijklm']['dfkf']['rotfklgf']" werden. Leider habe ich noch keinen Weg gefunden, wie ich das rekursiv für den gesamten Array hinbekomme. Folgende Hilfsfunktion habe ich:
function array_to_str($array){
foreach($array as $key => $val) {
if(is_array($val))
$str .= "['".$key."']".array_to_str($val)."\n";
else {
$str .= "['".$key."'] = "".$val."";\n";
}
}
return($str);
}
Aber die tut noch nicht so wie sie soll. Es kommt da so was raus wie:
['hijklm']['erior'] = "Wert";
['dfkf'] = "Wert";
Anstelle von:
['hijklm']['erior'] = "Wert";
['hijklm']['dfkf'] = "Wert";
Kennt jemand eine saubere Lösung dafür?
Gruß Rainer
echo $begrüßung;
Kennt jemand eine saubere Lösung dafür?
Wie wär's mit var_export()?
echo "$verabschiedung $name";
Hi Dedlfix!
Wie wär's mit var_export()?
Mit echo "<pre>", var_export($cfg), "</pre>"; bekomme ich das hier:
array (
'abc' =>
array (
'dfkle' => 'Wert',
'ilk' => 'Wert',
'tiouid' => 'Wert',
),
'defg' =>
array (
'roitzf' => 'Wert',
'dflfgzhj' => 'Wert',
),
'hijklm' =>
array (
'erior' => 'Wert',
'dfkf' => 'Wert',
),
)
Haben will ich aber das:
$cfg['abc']['dfkle'] = "Wert";
$cfg['abc']['ilk'] = "Wert";
$cfg['abc']['tiouid'] = "Wert";
$cfg['defg']['roitzf'] = "Wert";
$cfg['defg']['dflfgzhj'] = "Wert";
$cfg['defg']['dflfgzhj']['eroiut'] = "Wert";
$cfg['hijklm']['erior'] = "Wert";
$cfg['hijklm']['dfkf'] = "Wert";
$cfg['hijklm']['dfkf']['rotfklgf'] = "Wert";
Aus PHP-Sicht ist es egal wie es dargestellt wird. Aber in die Datei soll es so zurückgeschrieben werden, wie es daraus gelesen wurde.
Gruß Rainer
Hi,
als kleiner denk anstoß.
function aufbröseln($var)
{
if($key = key($var))
{
$exp = $var($key);
aufbröseln($exp);
}
else
{
return $var;
}
}
MfG
Haben will ich aber das:
$cfg['abc']['dfkle'] = "Wert";
$cfg['abc']['ilk'] = "Wert";
$cfg['abc']['tiouid'] = "Wert";
$cfg['defg']['roitzf'] = "Wert";
$cfg['defg']['dflfgzhj'] = "Wert";
$cfg['defg']['dflfgzhj']['eroiut'] = "Wert";
$cfg['hijklm']['erior'] = "Wert";
$cfg['hijklm']['dfkf'] = "Wert";
$cfg['hijklm']['dfkf']['rotfklgf'] = "Wert";
das wirst du aber nie bekommen...
$cfg['defg']['dflfgzhj'] = "Wert";
$cfg['defg']['dflfgzhj']['eroiut'] = "Wert";
$cfg['defg']['dflfgzhj'] weist du hier einmal nen string, und danach ein array zu... print_r($cfg); verrät dir, dass es beim array bleibt...
habe hier mal schnell was zusammen gebastelt.. (bemerke, dass ich die beiden keys geändert habe, die die vorherige string-zuweisung überschrieben haben)
$cfg['abc']['dfkle'] = "Wert";
$cfg['abc']['ilk'] = "Wert";
$cfg['abc']['tiouid'] = "Wert";
$cfg['defg']['roitzf'] = "Wert";
$cfg['defg']['dflfgzhj'] = "Wert";
$cfg['defg']['dflsdhj']['eroiut'] = "Wert";
$cfg['hijklm']['erior'] = "Wert";
$cfg['hijklm']['dfkf'] = "Wert";
$cfg['hijklm']['dfkfsd']['rotfklgf'] = "Wert";
function makeReadableArray($array,$pre='',$str=''){
if(count($array)==0) return '';
foreach($array AS $key => $val){
if(is_array($val)) $str .= makeReadableArray($val,$pre.'[''.$key.'']');
else $str .= $pre.'[''.$key.'']'.'="'.$val.'";'."\n";
}
return $str;
}
echo makeReadableArray($cfg,'$cfg');