rendered paste body function _refactor_struct($v) { $r = array(); $lvl = 0; $m =& $r; end($v); $fal = array(0, key($v)); foreach ($v as $i=>$e) { $e['tag'] = strtolower($e['tag']); if (in_array($i, $fal)) { if ($e['tag'] != '_top') die('expected "_top" tag at index '.$i.': got '.$e['tag']); if ($e['type'] != (($i == 0) ? 'open' : 'close')) die('expected '.(($i == 0) ? 'open' : 'close').' type at index '.$i.': got '.$e['type']); continue; } $ni = array('tag'=>$e['tag']); if ($e['attributes']) $ni['attributes'] = array_change_key_case($e['attributes']); switch ($e['type']) { case 'open': ++$lvl; $ni['content'] = array(); if ($e['value']) $ni['content'][] = $e['value']; $m[] = $ni; $om = $m; unset($m); $m =& $om[count($om) - 1]['content']; echo 'open: level '.$lvl.'/'.$ni['tag'].': '.$e['value']."\n"; var_dump($m); break; case 'close': --$lvl; unset($m); $m =& $r; for ($i = 0; $i < $lvl; ++$i) { $om = $m; unset($m); $m =& $om[count($om) - 1]->content; } echo 'close: level '.$lvl.'/'.$ni['tag']."\n"; break; case 'complete': $ni['content'] = $e['value']; $m[] = $ni; echo 'complete: level '.$lvl.'/'.$ni['tag'].': '.$e['value']."\n"; break; case 'cdata': $m[] = $e['value']; echo 'cdata: level '.$lvl.'/'.$ni['tag'].': '.$e['value']."\n"; break; default: var_dump($e); die('wtf in _refactor_struct'); } } var_dump($r); return $r; }