Recursively sort the output of get_categories() in order of parent-child hierarchy
<?php
$categories = get_the_category();
// Assemble a tree of category relationships
// Also re-key the category array for easier
// reference
$category_tree = array();
$keyed_categories = array();
foreach( (array)$categories as $c ) {
$category_tree[$c->cat_ID] = $c->category_parent;
$keyed_categories[$c->cat_ID] = $c;
}
// Now loop through and create a tiered list of
// categories
$tiered_categories = array();
$tier = 0;
// This is the recursive bit
while ( !empty( $category_tree ) ) {
$cats_to_unset = array();
foreach( (array)$category_tree as $cat_id => $cat_parent ) {
if ( !in_array( $cat_parent, array_keys( $category_tree ) ) ) {
$tiered_categories[$tier][] = $cat_id;
$cats_to_unset[] = $cat_id;
}
}
foreach( $cats_to_unset as $ctu ) {
unset( $category_tree[$ctu] );
}
$tier++;
}
// Walk through the tiers to order the cat objects properly
$ordered_categories = array();
foreach( (array)$tiered_categories as $tier ) {
foreach( (array)$tier as $tcat ) {
$ordered_categories[] = $keyed_categories[$tcat];
}
}
// Now you can loop over them and do whatever you want
foreach( (array)$ordered_categories as $oc ) {
echo $oc->cat_name . ' ';
}
?>