Ankündigung

Einklappen
Keine Ankündigung bisher.

Nach Anfangsbuchstabe sortieren

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Nach Anfangsbuchstabe sortieren

    Der Titel ist vllt etwas schlecht gewählt aber ich veruschs einfach mal zu erklären:

    Also ich hab ne Datenbank in der ne Tabelle ist mit folgenden Informationen:
    Interpret, Album, Trackanzahl

    Jetzt will ich das ganze in verschiedenen Tabellen ausgeben. Und zwar für jeden Anfangsbuchstaben der Interpreten eine eigene Tabelle.

    Beispiel:
    A
    Interpet mit A | Album | Trackanzahl
    Interpet mit A | Album | Trackanzahl
    Interpet mit A | Album | Trackanzahl

    B
    Interpet mit B | Album | Trackanzahl
    Interpet mit B | Album | Trackanzahl
    Interpet mit B | Album | Trackanzahl

    usw....
    Nur wie mache ich das?
    Bisher frage ich für jeden Buchstaben die Datenbank neu ab.
    Das ist etwas nervig und bestimmt auch "verschwendeter" code...

    Gibt mir jemand einen Tipp?

  • #2
    Willkommen im Forum

    PHP-Code:
    <?php
    mysql_connect
    ('localhost''***''***');
    mysql_select_db('***');

    // array_combine existiert erst seit PHP 5
    if (!function_exists('array_combine')) {
        function 
    array_combine($keys$values)
        {
            
    // nicht ganz die selbe Funktionalität
            
    $combined = array();
            for (
    $i 0$x min(count($keys), count($values)); $i $x; ++$i) {
                
    $combined[$keys[$i]] = $values[$i];
            }
            
    // aber ausreichend
            
    return $combined;
        }
    }

    // Funktion die uns den Anfangsbuchstaben eines Strings liefert
    // mit der Besonderheit Umlaute auf das 26-Buchstaben-Alphabet umzulegen (leider manuell)
    function getInitial($string)
    {
        
    $initial $string{0};
        if (
    preg_match('/^[a-z]$/i'$initial)) {
            return 
    strtoupper($initial);
        }
        switch (
    $initial) {
            case 
    'ä': case 'Ä':
                return 
    'A';
            case 
    'ö': case 'Ö':
                return 
    'O';
            case 
    'ü': case 'Ü':
                return 
    'U';
            default:
                
    // Anfangsbuchstabe ein anderes Zeichen? Dann Raute als Default
                
    return '#';
        }
    }

    // Query zur Abfrage
    $sql "SELECT `interpret`, `album`, `trackanzahl` FROM `alben` ORDER BY `interpret` ASC";
    $res mysql_query($sql) or die(mysql_error());
    // Schlüssel zwischen A-Z erstellen
    $keys range('A''Z');
    $keys[] = '#'// Raute für unbekannte Zeichen
    // Die Werte sollen leere Arrays sein
    $values array_fill(027, array());
    // Das ganz kombinieren und wir erhalten unsere leere $data-Maske, deren Schlüssel das Alphabet
    // und die Raute und deren Werte leere Arrays sind
    $data array_combine($keys$values);
    while (
    $line mysql_fetch_assoc($res)) {
        
    // Anfangsbuchstaben ermitteln
        
    $initial getInitial($line['interpret']);
        
    // und den $data Array dahingehend füllen
        
    $data[$initial][] = $line;
    }
    // Den Array durchlaufen
    foreach ($data as $initial => $group) {
        
    // Den Anfangsbuchstaben ausgeben
        
    printf('<hr />%s
    '
    $initial);
        for (
    $i 0$x count($group); $i $x; ++$i) {
            
    // Und natürlich noch die aus der Datenbank zugeordneten Gruppen
            
    printf('%u: %s
    '
    $i 1implode(', '$group[$i]));
        }
    }
    // Fertig
    ?>
    PS: Bitte Forenregeln lesen

    Kommentar


    • #3
      genial. danke
      ich hab jetzt mal versucht, die #'s vor dem rest anzuzeigen, indem ich die zeilen
      PHP-Code:
      $keys range('A''Z');
      $keys[] = '#'// Raute für unbekannte Zeichen 
      vertausche. geht auch prima. hat außerdem den (für mich positiven) nebeneffekt, dass leere kategorien wegfallen - nur warum?
      und warum bekomm ich jetzt die fehlermeldung
      "Warning: array_combine() [function.array-combine]: Both parameters should have an equal number of elements in /***/test.php on line 51
      wie kann ich das ohne fehlermeldung lösen?
      und vielleicht auch anders die leeren tabellen wegfallen lassen?

      Kommentar


      • #4
        Zitat von pHleX
        genial. danke
        ich hab jetzt mal versucht, die #'s vor dem rest anzuzeigen, indem ich die zeilen
        PHP-Code:
        $keys range('A''Z');
        $keys[] = '#'// Raute für unbekannte Zeichen 
        vertausche. geht auch prima.
        Das wundert mich sehr. Bitte versuche das Skript zu verstehen, nicht einfach nur durcheinander zuwürfeln.

        Kommentar


        • #5
          ich hab jetzt stundenlang gegrübelt, ausprobiert und rumgebastelt....
          komme zu keinem vernünftigen ergebnis.
          ne idee wies mit mir weitergeht?

          Kommentar


          • #6
            Du weißt $keys mittels range() die Buchstaben A-Z zu und fügst dann die # mittels [] Operator hinzu.

            Einfach vertauschen geht nicht, sonst überschreibt ja die Zuweisung von range() wieder alles, womit sich auch erklären würde, warum array_combine() fehlschlägt (# wurde ja überschrieben).

            PHP-Code:
            <?php
            $keys 
            = array('#');
            $keys array_merge($keysrange('A''Z'));
            ?>
            Das sollte funktionieren. Du musst array_merge() nicht kennen, aber was den Fehler verursacht sollte doch erschließbar sein (einfach mal Debuggen).

            Kommentar


            • #7
              jetz hab ichs verstanden
              dankeschön

              Kommentar


              • #8
                so hab das inzwischen soweit erweitert und verändert, dass es genau das tut, was ich will
                wie kann ich denn nur die tabellen anzeigen lassen, die überhaupt mindestens eine reihe enthalten?

                wenn ich das noch hinkrieg, bin ich glücklich

                Kommentar


                • #9
                  Dann hast du es ja offenbar immernoch nicht verstanden

                  Prinzip: Erstelle ein Array-Grundgerüst mit allen Elementen, aber ohne Inhalt, fülle sie.
                  Und was könnte man in diesem Konstrukt nun verändern, um nur die Reihen mit Inhalt gefüllt zu sehen? Richtig - das Grundgerüst nicht erstellen, zumindest erst zur Füllzeit!

                  Kommentar

                  Lädt...
                  X