Versione che ritorna un array di array.

Codice PHP:
<?php 
define
('DB_HOST''127.0.0.1');
define('DB_NAME''tests');
define('DB_USER''root');
define('DB_PWD' '');$bdd       = new PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME,DB_USER,DB_PWD, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
function 
hierarchie($padre,$bdd
{
 
$array    = array();
 
$maxDepth 15;
 
$array2   = array(); 
 
_hierarchie($padre,$bdd,$array,1,$maxDepth,$array2);
 return 
$array;
}
function 
_hierarchie($padre,$bdd,&$array,$level,$maxDepth,$array2,&$maxL=0
{
 if (
$level <= $maxDepth
 {
  
$array2[$level] = $padre;
  
$query          "select padre, figlio from tabella1 where padre=$padre order by padre, figlio";
  
$prepared       $bdd->prepare($query);
  
$prepared->execute();
  while (
$row $prepared->fetch(PDO::FETCH_NUMPDO::FETCH_ORI_NEXT)) 
  {
   
$level2 $level+1;
   
$maxL   $level2;
   
_hierarchie($row[1],$bdd,$array,$level2,$maxDepth,$array2,$maxL);
  }
  if (
$level >= $maxL
  {
   
$arrayRes = array();
   foreach(
$array2 as $key => $value
   {
    
$arrayRes[] = $value
   }
   
$array[] = $arrayRes;
  }
 }


$padre 1;
$array hierarchie($padre,$bdd); 
foreach(
$array as $key => $subarray) {
 print 
"$key => ";
 foreach(
$subarray as $value) {
  print 
$value."&nbsp;";
 }
 print 
"<br/>";
}

I dati
padre figlio
1 2
1 3
1 4
2 21
2 22
2 23
3 31
3 32
4 41
21 220
21 221
23 230
23 231
32 320
32 322
32 323
231 2310

Il risultato.

0 => 1 2 21 220
1 => 1 2 21 221
2 => 1 2 22
3 => 1 2 23 230
4 => 1 2 23 231 2310
5 => 1 3 31
6 => 1 3 32 320
7 => 1 3 32 322
8 => 1 3 32 323
9 => 1 4 41