<?php   ### get_dirtree_w_links.php ###

#--------------------------------------------------------------------------------- 
// $dir         Startverzeichnis, von dem aus der Directorybaum aufgelöst werden soll
// $dirtree     Adresse der Directory-Liste, die gefüllt werden soll
// $errors      Fehlerzähler, wird jeweils erhöht, wenn ein Directory nicht geöffnet
//              werden konnte
// $with_links  true -> Links auf Directories werden einbezogen
//
// RETURN       Fehlerzähler, Verzeichnisse, die nicht geöffnet werden konnten
//
// Beim Einbeziehne von Links auf Verzeichnisse können zirkuläre Verläufe entstehen,
// wenn der Link auf ein übergeordnetes Verzeichnis verweist


   function get_dirtree($dir, &$_dirtree, $with_links = true, $errors=0)
   {
      $dir = rtrim($dir, '/').'/';
      if (!$handle = opendir($dir)) return ++$errors;

      while (false !== ($res = readdir($handle)))
      {
          if(is_dir($dir.$res))
          {
              if ($with_links && is_link($dir.$res))
              {
                  $entry = realpath($dir.$res);
                  if(in_array($entry, $_dirtree)) continue;
                  $_dirtree[] = realpath($dir.$res);
                  $errors = get_dirtree($dir.$res, $_dirtree, $with_links, $errors);
              }
              elseif ($res != '.' && $res != '..' &&  !is_link($dir.$res))
              {
                  $_dirtree[] = realpath($dir.$res);
                  $errors = get_dirtree($dir.$res, $_dirtree, $with_links, $errors);
              }
          }    
      }
      
      return $errors;
   }

#-----------------------------------------------------------------------------------

   $_dirtree = array();

   $errors = get_dirtree('../../', $_dirtree);

   echo "<pre>\r\n";
   echo htmlspecialchars(print_r($_dirtree,1));
   echo "<p><b>Fehler:</b> $errors</p>\r\n";
   echo "</pre>\r\n";
   
?>