Többdimenziós tömb elemének érték dinamikusan
Config változókat többdimenziós tömbben szeretnék tárolni. Ezt a tömböt adott esetben futásidőben kell bővíteni, ez viszont nem akar sikerülni.$s_var_path: 'db:tbl:users' jellegű string
$m_var_value: az érték, amit szeretnék beállítani
Az elgondolásom az, hogy végigjárom az $s_var_path-ban megadott útvonalat a tömb adott eleméig (node), ezt az utat stringben rögzítem ($s_node_path), majd $$var-ként változóvá "konvertálva" gyorsan értéket adok neki.
Ami a fenti kódon kívül még eszembe jutott/próbáltam:
Már kellően sokat harcolásztam vele ahhoz, hogy lassan át sem látom. Örömmel fogadnék minden tanácsot akár a fenti megvalósítással, akár egy teljesen új megközelítéssel kapcsolatban!
Előre is kösz.
■ function cfg_set($s_var_path, $m_var_value)
{
// CONFIGVALTOZOK
static $CFG = array(
'db' => array(
'tbl' => array(
'users' => 'felhtabla',
'forum' => 'forumtabla'
)
)
);
// CFG SET/GET
$a_cfg_nodes = explode(':', $s_var_path);
$s_last_node = $a_cfg_nodes[count($a_cfg_nodes)-1];
$s_node_path = 'CFG';
foreach($a_cfg_nodes as $node) {
if ($node==$s_last_node) { // utolso node -> beallitjuk az erteket
$var = $s_node_path."['$node']";
${$var} = $m_var_value;
} else { // egyebkent felepitjuk a node-hoz a tombben vezeto utat
$s_node_path .= "['$node']";
}
}
print_r($CFG);
}
$m_var_value: az érték, amit szeretnék beállítani
Az elgondolásom az, hogy végigjárom az $s_var_path-ban megadott útvonalat a tömb adott eleméig (node), ezt az utat stringben rögzítem ($s_node_path), majd $$var-ként változóvá "konvertálva" gyorsan értéket adok neki.
Ami a fenti kódon kívül még eszembe jutott/próbáltam:
- Referenciaként visszaírni $CFG-be (${$var} &= $m_var_value;) - Undefined variable: CFG['db']['tbl']['users'] a válasz, ráadásul ez új configváltozó esetén nem járható út
- array_push(), array_walk() - egyikben sem láttam a számomra megfelelő megoldást. Az array_walk()-nál olvastam, hogy a callback függvényben nem lehet módosítani az eredeti tömböt, mert annak megjósolhatatlan lesz az eredménye... nem tudom eldönteni, ez vonatkozik-e rám. :)
- Google, WL kereső (create dinamic(ally) array +PHP, tömb +dinamikus +PHP, stb...)
Már kellően sokat harcolásztam vele ahhoz, hogy lassan át sem látom. Örömmel fogadnék minden tanácsot akár a fenti megvalósítással, akár egy teljesen új megközelítéssel kapcsolatban!
Előre is kösz.
INI?
Nem rossz, csak írás?
Változott értékek futásidőn kívüli rögzítésére nincs szükségem, ezért pl. egy xml-alapú ötletem is elvetettem már.
Átnéztem a korábban itt, a Weblaboron zajlott config konstansokban vs egyébben szálat, meg találtam a manualban a megjegyzések közt writeINIfile() függvényt, szóval végső megoldásként működhet, de egyenlőre még keresem az boldogító utat. :)
A változók érvényességi körén gondolkodtam még a témaindító problémával kapcsolatban, de nem jutottam előbbre.
Az érték lekérése megy simán, később közzéteszem azt is.
Nem akkora overhead...
olvasás? ;)
Amúgy jó kis kérdés, egy lehetséges megoldás:
Köszönöm, elegáns megoldás!
Már hajnali háromtól legóztam vele, szétszedtem, átépítettem, meg vissza, és nagyon tetszik. Remek a rekurzív útvonal-fogyasztás.
Nem bánod, ha használom a kódod (saját célra), ugye? Beleírom a forráskódba a köszönetnyilvánítást.
Érdekes, hogy a pontozott útvonal nekem is eszembe jutott, aztán a beszélt nyelv "ebből ez következik" kettőspontjára váltottam. Megkérdezhetem, hogy miért ezt választottad? OO JS cikked kapcsolatban van ezzel? :)
Erre gondolsz?
szivesen
köszi
Nyugodtan, Neked írtam, kis éjfél utáni levezetés. :)
Érdekelt a dolog, mert előjött már nekem is hasonló probléma (Request objekt tudjon olyat, hogy
$request->get("user[name]"
)), csak ott kicsit bonyolultabb megoldásszületett (korrigálni kell ilyen esetben a$FILES
tömben lévő elkefélt tartalmat).Nem volt benne semmi ilyen tudatosság, csak úgy ez jött.
Arra gondoltam, hogy ha van egy set függvényed és abban van a konfig egy statikus tömbben, akkor hogyan csinálsz get függvényt?
Felhő
logikai buktató
Eredetileg egyetlen cfg() függvény végezte a set és get feladatot is (nyitóbejegyzésem kódrészletében benn is maradt a // CFG SET/GET megjegyzés). Ha volt változóérték, akkor set, egyébként get. Működött.
Utóbb azonban rájöttem, hogy ez inkább tervezési hiba, mint feature :), mert ha null-t adok változóértéknek (~unset), akkor a függvény get-ként működik.
Végeredményben tehát valóban volt logikai hiba, csak nem ott.
A kódot pedig még egyszer köszönöm!
Hát én ezt a topicot...
Az eredeti amúgy miért nem működött?