Gruppierte Ausgabe der Datensetze

  • Hallo,
    ich hab zwei Datenbanktabellen - Artikel und Kategorie

    jetzt bräuchte ich so ne Ausgabe der Datensetze

    mygroup[1] = new Array();
    mygroup[1][0] = new Option("eins", 2);
    mygroup[1][1] = new Option("zwei", 4);
    mygroup[1][2] = new Option("drei", 8);

    mygroup[2] = new Array();
    mygroup[2][0] = new Option("one", 1);
    mygroup[2][1] = new Option("two", 3);
    mygroup[2][2] = new Option("three", 9);

    mygroup[40] = new Array();
    mygroup[40][0] = new Option("un", 5);
    mygroup[40][1] = new Option("deux", 50);
    mygroup[40][2] = new Option("trois", 500);

    wie stell ich das an? :)

    Danke

  • Ich verstehe ehrlich gesagt Bahnhof. Wie sind denn die Daten in der DB hinterlegt? Das da oben ist ja nur das Ziel, aber nicht der Ausgangspunkt. "Artikel und Kategorie" wo sind die? Ich sehe da nur Zahlen und Ziffern.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • ich hab zwei Tabellen in der Datenbank - eine Kategorie und eine Artikel Tabelle.
    Ausgeben möchte ich das ganze wie oben zu sehen in einem verschachteltem Array

    mygroup[1] = Kategorie
    mygroup[1][0] = dazugehöriger Artikel
    mygroup[1][1] = zweiter Artikel usw.

  • Bahnhof habe ich auch rausgehört. Sonst leider sehr wenig.

    Was für eine Datenbank? SQL? Wie sehen die Tabellen aus? Was hat das Array mit der Datenbank zu tun? Brauchst du nur die SQL-Statements? Oder die ganze Abfrage inklusive Überführung in ein Array als Source Code? Wenn ja, welche Programmiersprache?

    edit:
    Auch dein Erklärung ist für mich genau so Bahnhof wie der ursprüngliche Beitrag...

  • ok MySQL - die Datenbanken sehen so aus

    CREATE TABLE IF NOT EXISTS `tx_gbsdownload_cat` (
    `uid` int(11) NOT NULL auto_increment,
    `pid` int(11) NOT NULL default '0',
    `tstamp` int(11) NOT NULL default '0',
    `crdate` int(11) NOT NULL default '0',
    `cruser_id` int(11) NOT NULL default '0',
    `deleted` tinyint(4) NOT NULL default '0',
    `hidden` tinyint(4) NOT NULL default '0',
    `title` tinytext,
    PRIMARY KEY (`uid`),
    KEY `parent` (`pid`)
    )

    CREATE TABLE IF NOT EXISTS `tx_gbsdownload_artikel` (
    `uid` int(11) NOT NULL auto_increment,
    `pid` int(11) NOT NULL default '0',
    `tstamp` int(11) NOT NULL default '0',
    `crdate` int(11) NOT NULL default '0',
    `cruser_id` int(11) NOT NULL default '0',
    `deleted` tinyint(4) NOT NULL default '0',
    `hidden` tinyint(4) NOT NULL default '0',
    `title` tinytext,
    `zuordnung` int(11) NOT NULL default '0',
    PRIMARY KEY (`uid`),
    KEY `parent` (`pid`)
    )

    in tx_gbsdownload_artikel `zuordnung` wird über die UID von tx_gbsdownload_cat eine Zuordnung gemacht.

    Die Arrays haben nichts mit der DB zutun ich brauch diese Ausgabe später nur für ein Javascript.

    Mir fehlt die herangehensweise - denn mit ner while Abfrage wird das ja nicht so einfach umgesetzt sein - speziell die Gruppierung

  • Hm, also so langsam kommen wir der Sache näher. Nun haben wir die Struktur. Wie sehen die Daten aus? Ich frage z.B. daher, da Du etwa mygroup[1] 2 / 40 hast. Wo kommen die Werte her? Frei erfunden? Werte aus der DB oder einfach eine fortlaufende Zählung?

    new Option("one", 1);
    "one" steht hier nun wo in der Datenbank? "1" wo?

    Woher wird ersichtlich, dass
    Option("one", 1);
    Option("two", 3);
    Option("three", 9);

    zusammengehören?

    Mein Verdacht ist ja, dass die Zugehörigkeit über die tx_gbsdownload_artikel.zuordnung kommt und die ganzen option() zwei Werte aus der tx_gbsdownload_artikel sind, nur welche? tx_gbsdownload_cat wäre dann was genau? Stecht wo im Array?

    Ich brauche ein Medium.... muss Hellsehen lernen ;)

    Und doch, das ganze erledigt man normalerweise in einer while()

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • das oben sind nur Beispielwerte - ich brauch nur die Struktur - also der Aufbau muss so aussehen.

    new Option("one", 1);
    "one" steht hier nun wo in der Datenbank? "1" wo?

    one steht hier -> tx_gbsdownload_artikel title
    1 -> tx_gbsdownload_artikel uid

    Woher wird ersichtlich, dass
    Option("one", 1);
    Option("two", 3);
    Option("three", 9);

    zusammengehören?

    -> würde mal sagen über die UID der Kategorie also tx_gbsdownload_artikel zuordnung

  • Also schaut das Ergebnis dann eigentlich so aus (mit Feldnamen) ??

    mygroup[_artikel.zuordnung] = new Array();
    mygroup[_artikel.zuordnung][0] = new Option(_artikel.title, _artikel.uid);
    mygroup[_artikel.zuordnung][1] = new Option(_artikel.title, _artikel.uid);

    Die zweite Dimension des Arrays ist dann nur eine fortlaufende Zählung?

    Wozu dient dann die "tx_gbsdownload_cat"? Die UID der cat steht ja auch als "zuordnung" und der "tx_gbsdownload_artikel". Beispiel ist ja schön, nur wenn das so verfremdet ist, dann macht es das nur kompliziert ;)

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Ok, dann braucht man die _cat also erst mal gar nicht.

    Um die while kommste nicht umher, irgendwie musst Du die Daten ja aus der DB bekommen. Frage nur, ob man die dann gleich mit echo als "Javascript" ausgibt oder erst mal "baugleich" in ein PHP-Array schreibt. Letzteres braucht mehr Ressourcen, macht es aber auch übersichtlicher (meine Meinung).


    versuche das mal, hoffe da ist kein Syntaxfehler drinnen. Müsste eigentlich ein PHP-Array liefern, das in etwa so aussieht wie das gewünscht JS-Array. Allerdings ohne Bedingungen und ohne Sortierungen.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • das php array sieht gut aus ;) danke - nur wie bekomm ich das jetzt so in diese Javascript-form
    hab schon mit

    echo 'mygroup['.$zuordnung.'] = new Array();';
    echo 'mygroup['.$zuordnung.'][0] = new Option("'.$row['title'].'", '.$row['uid'].');';

    aber das funkt ja mal so gar nicht ;)

    bzw. wie bau ich so ein array auf - das würde mir mehr helfen

    $options = array(
    array("value" => "A1", "text" => "Bundesliga", "options" => array(
    array("value" => "A1-B1", "text" => "FC Bayern München", "options" => array(
    array("value" => "A1-B1-C1", "text" => "Philipp Lahm"),
    array("value" => "A1-B1-C2", "text" => "Bastian Schweinsteiger"),
    array("value" => "A1-B1-C3", "text" => "Mario Gomez")
    )),
    array("value" => "A1-B2", "text" => "SV Werder Bremen", "options" => array(
    array("value" => "A1-B2-C1", "text" => "Hugo Almeida")
    )),
    array("value" => "A1-B3", "text" => "Hertha BSC Berlin"),
    array("value" => "A1-B4", "text" => "TSG Hoffenheim 1899", "options" => array(
    array("value" => "A1-B4-C1", "text" => "Timo Hildebrand"),
    array("value" => "A1-B4-C2", "text" => "Carlos Eduardo")
    ))
    )),
    array("value" => "A2", "text" => "Champions-League", "options" => array(
    array("value" => "A2-B1", "text" => "Real Madrid"),
    array("value" => "A2-B2", "text" => "Manchester United", "options" => array(
    array("value" => "A2-B2-C1", "text" => "Berbatow, Dimitar")
    ))
    )),
    array("value" => "A3", "text" => "Europa-League", "options" => array()
    ));

  • Also entweder so wie vorgeschlagen mit dem PHP-Array, dann einfach ein foreach durchlaufen lassen und das JS-Array bilden. Ist doppelt gemoppelt, erst while, dann foreach, aber übersichtlicher. Wenn es nicht zu viele Datensätze sind spielt es auch keine Rolle. Oder eben, direkt im while die Ausgabe mit echo machen:

    1:

    Code
    foreach($mygroup AS $key => $value)
    {
    	echo "mygroup[".$key."] = new Array();\n";
    
    	foreach($value AS $k => $v)
    	{
    		echo "mygroup[".$key."][".$k."] = new Option('".$v[0]."', ".$v[1].");\n";
    	}
    }


    ungetestet, aber so in etwa. Das erste foreach durchläuft die einzelnen Zuordnungsgruppen, das innere foreach dann die einzelnen Werte pro Gruppe.

    $key müsste die uid der Gruppe sein
    $k der fortlaufende Zähler
    $v1 der Titel
    $v2 die uid

    2:*** entfernt ***
    Wenn ich es mir recht überlege, dann wird die zweite Variante recht umständlich , auch wenn schneller. Man muss dort quasi alles direkt per echo ausgeben. Nur eben auch prüfen, ob ein "new Array();" schon geechot wurde oder nicht. Das macht in der anderen Version das isset(). Zudem muss man die Abfrage aus der DB sortieren nach uid, damit die auch in der richtigen Reihenfolge der Gruppe ankommen. Bei der PHP-Version ist es egal wie die ankommen, im Array werden die dann schon an die richtige Stelle / Gruppe gepackt. Das müsste man in JS selbst lösen, also vorher sortieren.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • also das mit dem foreach heut irgendwie nicht so hin :(

    $mygroup = array();
    while($row=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
    $key = $row['zuordnung'];
    foreach($mygroup AS $key => $value){
    echo "mygroup[".$key."] = new Array();\n";
    foreach($value AS $k => $v){
    echo "mygroup[".$key."][".$k."] = new Option('".$v[0]."', ".$v[1].");\n";
    }
    }
    }

  • Äm, wenn Du das mit dem PHP-Array und dem foreach machst, dann muss das foreach-Zeugs aus der While-Schleife raus.

    DB anfragen -> per while-Schleife in Array schreiben. Punkt 1 fertig. Per foreach wieder auf das Array von vorher zugreifen, auslesen und JS-Code schreiben.

    Also :

    Select-Dinges....
    while()
    {
    /* Wird das PHP-Array gefüllt
    }

    foreach()
    {
    /* PHP-Array durchlaufen und JS-Code echoen */
    }

    Daher sagte ich, es ist doppelt gemoppelt. Datenbestand aus DB in ein Array und dann aus dem Array den eigentlichen Code zu erzeugen.

    also etwa so:

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(