1

Thema: Probleme mit Datenstrukturen

Hallo Ihr!

Heute habe ich mal ein Problem mit ner Programmieraufgabe .. ich check
grad nix ..   <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" /> 

Situation:

Ich habe eine Datenbanktabelle mit der folgenden Strucktur:

id | titel | irgendwas | irgendwas

Hier mal ein kurzer Dump (wobei hier nur der zweite Eintrag von
Bedeutung ist):

VALUES (1, 'Auto & Motorrad:Automobile:Alfa Romeo', 0, 0);
VALUES (2, 'Auto & Motorrad:Automobile:Audi', 0, 1);
VALUES (3, 'Auto & Motorrad:Automobile:BMW', 0, 1);
VALUES (4, 'Computer & Computerspiele:Spiele', 0, 1);
VALUES (5, 'Computer & Computerspiele:Spiele:Test1', 0, 1);
VALUES (6, 'Computer & Computerspiele:Spiele:Test2', 0, 1);
VALUES (7, 'Computer & Computerspiele:Spiele:Test2:usw.', 0, 1);

�ber den Titel dieser Einträge muss ich ein Abfrage für ein
JavaScript-Menü erzeugen. Die Kategorien, bzw. Subkategorien sind von
der Logik mit einem Doppelpunkt (  <img border="0" title="" alt="[Lächeln]" src="images/icons/smile.gif" />   voneinander getrennt. Also obiges
Beispiel würde den folgenden Tree ergeben:

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">+- Auto & Motorrad
   |- Alfa Romeo
   |- Audi
   |- BMW
+- Computer & Computerspiele
   |- Spiele
      |- Test1
      |- Test2
         |-- usw.[/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Den Inhalt muÃ? ich nun in ein JavaScript-Objekt jagen und zwar anhand
der folgenden Logik im JavaScript:

Tree.setTreeItems("[id]|[parentid]|[titel]");

Demnach mü�te das oben gezeigte Beispiel wie folgt ausgegeben werden:

Tree.setTreeItems("1|0|Auto & Motorrad");
Tree.setTreeItems("2|1|Alfa Romeo");
Tree.setTreeItems("3|1|Audi");
Tree.setTreeItems("4|1|BMW");
Tree.setTreeItems("5|0|Computer & Computerspiele");
Tree.setTreeItems("6|5|Spiele");
Tree.setTreeItems("7|6|Test1");
Tree.setTreeItems("8|6|Test2");
Tree.setTreeItems("9|8|usw.");

Nun check ich aber grad überhaupt nicht so recht, wie ich die
Datenbankabfrage und die Perlroutinen am geschicktesten schreiben muss,
um zu so einem Ergebnis zu gelangen.

Könnte Ihr mich dabei evtl. unterstützen .. in Perl seit Ihr doch alle
Megafit ;o)

Tausend Dank schon mal!

Viele Grü�e
Hannes
 
  <small>[ 04-12-2002, 23:00: Beitrag editiert von: J|G ]</small>

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de

2

Re: Probleme mit Datenstrukturen

Hi Hannes,

ich hab von Perl zwar keine Ahnung, aber es geht dir doch erstmal ums Vorgehen und nicht um die Syntax, oder?

Ich sag dir mal, wie ich in PHP vorgehen würde:

Ich würde ein Array anlegen:
$arrKategorien[name_der_kategirie][id oder p_id]

Jetzt würde ich die Datensätze auslesen und jede (Sub-)Kategorie der Reihenfolge nach durchgehen.

$p_id bei jedem neuen datensatz auf 0 setzen;

Existiert die Kategorie noch nicht im Array

if(!$arrKategorien[$kategorie])

dann leg für sie ein Array-Feld an weise ihr die nächste freie ID zu

$arrKategorien[$kategorie][id]=count($arrKategorie);

sowie die Parent-ID

$arrKategorien[$kategorie][p_id]=$p_id;

dann aktualisiere $p_id

$p_id = $arrKategorien[$kategorie][id]

Die muß natürlich beim nächsten Datensatz wieder auf 0 gesetzt werden.

Somit hast du alle daten in einem Array und brauchst dieses nurnoch durchzulaufen und Titel, ID und P_ID auszugeben.

Ich weiß natürlich nicht, wieweit das so in Perl möglich ist, oder ob es nicht einfachere Wege gibt...

Basti

3

Re: Probleme mit Datenstrukturen

Hallo Basti,

danke für Deine interessante Abhandlung! Es ist immer wieder lehrreich die Logik anderen anzuhören. Ich habe meine Problem nun wie folgt gelöst:

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">#!/usr/bin/perl
   
  use DBI;
  use Data::Dumper;
  use CGI::Carp qw/fatalsToBrowser/;
   
   
  $DBHOST = "xx";
  $DBNAME = "xx";
  $DBUSER = "xx";
  $DBPASS = "xx";
   
   
  $Data::Dumper::Indent = 1;
  my $tree = {
      next_id => 1,
      tree    => {},
      id_map  => {
          '' => 0,
      },
  };
   
   
   
  my $dbh = DBI->connect("DBI:mysql:database=$DBNAME;host=$DBHOST",$DBUSER, $DBPASS);
  my $sth = $dbh->prepare("SELECT title FROM Categories");
  $sth->execute();
  while(my $t = $sth->fetch()) {
    parse_category( $tree, $t->[0] );
  }
   
   
  print "Content-type: text/htmlnn";
  print "ok";
  dump_tree( $tree, $tree->{'tree'}, '' );
  exit( 0 );
   
   
  sub parse_category
  {
      my $tree         = shift;
      my $new_category = shift;
   
       my @sub_categories = split( /:/, $new_category );
   
      map { exists( $tree->{'id_map'}{$_} ) or $tree->{'id_map'}{$_} = $tree->{'next_id'}++; } @sub_categories;
   
      my $papa = $tree->{'tree'};  # root
      foreach my $baba ( @sub_categories )
      {
          $papa->{$baba} = {}     unless exists $papa->{$baba};
          $papa = $papa->{$baba}; 
      }
  }
   
  sub dump_tree
  {
      my $tree     = shift;
      my $sub_tree = shift;
      my $papa     = shift;
   
      foreach my $category ( sort( keys( %{$sub_tree} ) ) )
      {
          printf( "Tree.setTreeItems("%d|%d|%s");n",
                  $tree->{'id_map'}{$category},
                  $tree->{'id_map'}{$papa},
                  $category
                );
          if( keys( %{$sub_tree->{$category}} ) > 0 )
          {
              dump_tree( $tree, $sub_tree->{$category}, $category );
          }
      }
  } [/code]</blockquote><font size="2" face="Verdana, Helvetica, sans-serif">Mit dem tollen Ergebnis, dass die zugrunde liegenden Datensatze zu umfangfreich für Arrays in JavaScript sind *g* ... jetzt kann ich mir wieder was neues einfallen lassen ..

cucu
Hannes

_______________________________________________________________

/-/annes (j|g) ... http://www.jg-webdesign.de