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