$arrCategoryTree = array(); while ($result_row = mysql_fetch_row($objRS)) { $arrCategoryTree[] = array ( 'category_id' => $result_row[0], 'parent_category_id' => $result_row[1], 'category_name' => $result_row[2] ); } //var_dump ($arrCategoryTree); function tree($id_parent = 0, $indent = 0) { global $arrCategoryTree, $ret_tree; $tt = array(); $x = 0; $loop = 0; foreach($arrCategoryTree as $n) { if( $n['parent_category_id'] == $id_parent) { $tt[$x++] = $loop; } $loop++; } /*-- if there are some parent ids --*/ if( $x != 0){ foreach($tt as $d) { $tmp = array(); foreach($arrCategoryTree[$d] as $key => $value) { $tmp[$key] = $value; } $tmp['indent'] = $indent; $ret_tree[] = $tmp; tree($tmp['category_id'], $indent+1); } } else { return; } } $ret_tree = array(); tree(0,0); foreach($ret_tree as $cat) { $indent = ''; $indent .= str_repeat ("\t", $cat['indent']); if ($intPreviousIndent <= $cat['indent']) echo ("\n"); echo ($indent . $cat['category_name']); //target structure /* < category name="subfolder2.1" id="3"/> */ $intPreviousIndent = $cat['indent']; } //var_dump($ret_tree);