| 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: 12 let
|
|||
0