Autor Zpráva
Kammil
Profil *
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');
pak znám klíče pro nová pole která potřebuji vytvořit které jsou totožné s klíči které potřebuji vypsat
$dis = array('a', 'b', 'c');
a takové pole potřebuji ve finále nadefinovat pro další použití
$newarr = array();
$newarr['a'] = array('FOO' => 'a',   'BAR' => 'a2');
$newarr['b'] = array('FOO' => 'ab',  'BAR' => 'ab2');
$newarr['c'] = array('FOO' => 'abc', 'BAR' => 'abc2');
Chodí sem nějaký profík ? Díky za pomoc...
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
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
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
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
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);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: