altrimenti potresti fare tutto con una query e lavorando di più di php, del tipo

Codice PHP:

   $sql 
'SELECT FROM `tabella` WHERE';
   
$res mysql_query($sql);
   
   
$rows = array();
   
$parents = array();

   while(
$row mysql_fetch_assoc($res)){
      
$rows[] = $row;
      if(!
is_array($row['cat_parent_id'])) $row['cat_parent_id'] = array();
      
array_push($parents[$row['cat_parent_id']],$row['id_categorie']);
   } 
quindi useresti ancora una ricorsione per scorrere l'albero, sta volta però senza interrogare il db

Codice PHP:

function print_level($parent 0){
      global 
$rows;
      global 
$parents;
      if(
is_array($parents[$parent] && !empty($parents[$parent]))){
            foreach(
$parents[$parent] as $el){
                  
// agisco sull'elemento del livello corrente
                  // controllo se ha figli
                  
if(is_array($parents[$el] && !empty($parents[$el]))){
                              
print_level($el);
                  }
            }
      }
}

print_level();