Autor | Zpráva | ||
---|---|---|---|
Kammil Profil * |
#1 · Zasláno: 4. 6. 2014, 22:32:16
Ahoj, mám takové pole které se mění obsahem i hloubkou
$arr = array(); $arr['a'] = array('FOO' => 'a', 'BAR' => 'a2'); $arr['a']['b'] = array('FOO' => 'ab', 'BAR' => 'ab2'); $arr['a']['b']['c'] = array('FOO' => 'abc', 'BAR' => 'abc2'); $dis = array('a', 'b', 'c'); $newarr = array(); $newarr['a'] = array('FOO' => 'a', 'BAR' => 'a2'); $newarr['b'] = array('FOO' => 'ab', 'BAR' => 'ab2'); $newarr['c'] = array('FOO' => 'abc', 'BAR' => 'abc2'); |
||
quatzael Profil |
Já si myslím, že by to šlo takhle.. Nejsem si ale úplně jistej, jestli jsem Tě pochopil správně..
Zkus to vyzkoušet jestli to funguje: foreach ($dis as $key=>$val) { $traverse[$key] = $val; $transitory = '$arr'; foreach ($traverse as $k=>$v) { $transitory .= "['".$v."']"; } $newarr[$val] = $$transitory; } |
||
juriad Profil |
#3 · Zasláno: 5. 6. 2014, 00:01:32
Spíš něco takového. Toto dokonce funguje a nevyžaduje nějaké harakiri s proměnnými proměnnými.
$newarr = array(); $pointer = $arr; foreach ($dis as $val) { $newarr[$val] = array(); foreach ($pointer[$val] as $k => $v) { if (is_scalar($v)) { $newarr[$val][$k] = $v; } } $pointer = $pointer[$val]; } var_dump($newarr); |
||
quatzael Profil |
#4 · Zasláno: 5. 6. 2014, 00:08:54
juriad:
A jaktože teda to moje řešení nefunguje? Je nějaký způsob, aby to harakiri fungovalo nebo to tak opravdu nejde? |
||
juriad Profil |
#5 · Zasláno: 5. 6. 2014, 00:13:50
V proměnných proměnných se můžeš odkazovat jen na název, nikoli výraz. Na to bys už potřeboval eval. Navíc, ten tvůj kód trpí problémem, že výsledek bude $newarr['a'] a $newarr['b'] bude obsahovat i ta vnitřní pole.
|
||
quatzael Profil |
juriad:
hm, tak nic.. |
||
juriad Profil |
#7 · Zasláno: 5. 6. 2014, 00:22:46
A kdyby se to někomu zdálo moc dlouhé, tak ekvivalentně to lze zapsat takto; víc už to zkrátit asi neumím. Opovažte se to někdo použít!
$p = $arr; foreach ($dis as $d) foreach ($p = $p[$d] as $k => $v) !is_scalar($v) ?: $newarr[$d][$k] = $v; var_dump($newarr); |
||
Časová prodleva: 10 let
|
0