Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP DB Einträge Alphabetisch ordnen

Einklappen

Neue Werbung 2019

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

  • PHP DB Einträge Alphabetisch ordnen

    Hey,

    ich habe vorhin gegoogelt und bin dabei auf diesen Beitrag gestoßen. Da der Beitrag von 2008 stammt dachte ich frage ich lieber in einem neuen Beitrag.

    Ich habe den Code von dort genommen und mich damit auseinander gesetzt,
    ich möchte Fragen aus einer FAQ damit ordnen.

    Ich habe den Code so:

    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 `question`, `answer` FROM `faq_question`"
    $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['question']); 
        
    // und den $data Array dahingehend füllen 
          
    $data[$initial][] = $line

    // Den Array durchlaufen 
    foreach ($data as $initial => $group) { 
        
    // Den Anfangsbuchstaben ausgeben 
          
    echo "$initial <hr /><br />";
          
        for (
    $i 0$x count($group); $i $x; ++$i) { 
            
    // Und natürlich noch die aus der Datenbank zugeordneten Gruppen  
                    
    echo implode(', '$group[$i]);  
        } 

    // Fertig 
    ?>
    Um den Code besser zu verstehen habe ich immer verschiedene Teile des Codes mit der Kommentar Funktion "abgeschaltet" und mir den Stand der Verarbeitung ausgegeben.

    Allerdings habe ich jetzt das Problem, dass die Fragen ohne Zeilen Umbruch wiedergegeben werden. Deshalb muss ich hier:

    echo implode(', ', $group[$i]);

    ja irgendwie noch </ br> einfügen, allerdings weiß ich nicht wie.


    Der gesammte Code oben ist in einer Datei, später möchte ich es in eine andere Datei einfügen in der die Abfrage eben auch answer enthält (so wie oben) jedoch soll nur die Antwort und nicht question+answer ausgegeben werden. Wie kann ich das machen?

    Außerdem wollte ich # vor A-Z haben allerdings habe ich das auch nicht hinbekommen.

    Vielen Dank schonmal für eure Hilfe.


  • #2
    Um die Einträge sortiert ausgeben zu können musst Du die Abfrage einfach nur mit ORDER BY question ASC erweitern.

    Wie Du Umlaute richtig sortierst steht hier:
    MySQL :: MySQL 5.1 Referenzhandbuch :: 10.5.6 Beispiel für die Auswirkung von Sortierfolgen

    Alternativ könntest Du beim Hinzufügen von neuen Datensätzen in einer weiteren Spalte den Sortierungsparameter selbst bestimmen. Das macht Sinn, wenn Du bestimmte Zeichen zusammenfassen möchtest.

    Der gesamte Code ist mit Verlaub totaler Unsinn. Diese ganzen Funktionen und hin und her Sortierei kannst Du Dir sparen, wenn die Daten bereits korrekt in MySQL vorliegen.
    meine PHP Scripte

    Kommentar


    • #3
      Hey,

      Es ist so, dass es im Layout später so aussehen soll

      A
      ------------ (<hr />)
      FRAGEN mit A

      B
      ---------------
      FRAGEN mit B

      und so weiter, und ich eben nicht weiß wie ich das machen soll wenn ich nur ORDER BY nehme, sonst wäre es ja nicht schwer. (Alle Fragen werden in ein Array eingelesen (While abfrage fetch....))

      Kommentar


      • #4
        Zitat von sdcleitung Beitrag anzeigen
        Es ist so, dass es im Layout später so aussehen soll

        A
        ------------ (<hr />)
        FRAGEN mit A

        B
        ---------------
        FRAGEN mit B

        und so weiter
        Das nennt man in der Programmierung einen Gruppenwechsel (Suchstichwort).

        Kommentar


        • #5
          Hey,
          danke gibts dafür auch irgendwie ein Funktionsname ?
          Habe hier ein PHP Buch und unter Gruppenwechsel finde ich nichts ...

          ---------------------------------------------------------------------------------------------

          Hat das was mit group by zu tun?

          Kommentar


          • #6
            Zitat von sdcleitung Beitrag anzeigen
            danke gibts dafür auch irgendwie ein Funktionsname ?
            Habe hier ein PHP Buch und unter Gruppenwechsel finde ich nichts ...
            Das ist keine vorgefertigte Funktion, sondern eine generelle Vorgehensweise, wie man so etwas programmiert.

            Hat das was mit group by zu tun?
            Nein, es betrifft lediglich die Ausgabe von in sortierter Form vorliegender Daten.

            Kommentar


            • #7
              Hey,
              ja sorry falsch ausgedrückt wollte eben wissen ob es ein anderes Stichwort dafür gibt...
              (das ich im Buch dann evtl. finden kann)?

              ----------------------------------------------------------------------------------------------------------------

              Hey,
              ok ich habe es mir nochmal alles überlegt und dabei ist mir aufgefallen das ich das glaube ich so nicht machen kann.

              Alle Daten aus der Tabelle werden im späteren Script in EIN Array eingelesen. Dieses Array wird in einer anderen Datei wieder einzeln ausgelesen. Deshalb wäre es doch besser für jeden Buchstaben ein Array anzulegen oder?

              Also alle Daten werden werden eben in ein Array eingelesen, in einer anderen (Template) Datei werden diese wieder ausgelesen.

              Kommentar


              • #8
                Gruppenbruch (Standardverfahren) - PHP.de Wiki
                --

                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                --

                Kommentar


                • #9
                  Hey,
                  danke ich schaus mir gleich mal an ...

                  Kommentar


                  • #10
                    Hey,
                    habe es jetzt so umgesetzt, allerdings ist die Seite weiß -.-

                    <?php
                    mysql_connect('localhost', '***', '***');
                    mysql_select_db('***');



                    $sql = "SELECT `question`, `answer` FROM `faq_question` ORDER BY question ASC";
                    $res = mysql_query($sql) or die(mysql_error());

                    while (mysql_fetch_assoc($res)) {
                    $items[] = Array(
                    "question" => $res['question'],
                    "answer" => $res['answer']
                    );
                    }

                    foreach ($items['question'] as $entry) {
                    if (false === isset ($ordered[$entry[0]])) {
                    $ordered[$entry[0]] = array ();
                    }
                    $ordered[$entry[0]][] = $entry;
                    }



                    // Ausgabe nach Reihenfolge des ersten Auftretens
                    foreach ($ordered as $character => $set) {
                    echo $character . '<hr />';
                    echo implode (' <br /> ' , $set) . '<br />';
                    echo '<br />';
                    }?>

                    Ich komm einfach nicht drauf was nicht stimmt ...

                    Kommentar


                    • #11
                      Beim Posten bitte bbCode für Quellbeispiele verwenden und Code einrücken.
                      --

                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                      --

                      Kommentar


                      • #12
                        Hey,
                        sorry aber kannst du mir dann helfen:

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



                        $sql "SELECT `question`, `answer` FROM `faq_question` ORDER BY question ASC"
                        $res mysql_query($sql) or die(mysql_error()); 

                        while (
                        $line mysql_fetch_assoc($res)) { 
                            
                        $items[] = Array(
                                
                        "question" => $res['question'],
                                
                        "answer" => $res['answer']
                            );
                        }
                         
                        foreach (
                        $items['question'] as $entry) {
                            if (
                        false === isset ($ordered[$entry[0]])) {
                                
                        $ordered[$entry[0]] = array ();
                                }
                            
                        $ordered[$entry[0]][] = $entry;
                        }
                         
                         
                         
                        // Ausgabe nach Reihenfolge des ersten Auftretens
                        foreach ($ordered as $character => $set) {
                            echo 
                        $character '<hr />';
                            echo 
                        implode (' <br /> ' $set) . '<br />';
                            echo 
                        '<br />';
                        }
                        ?>

                        Kommentar


                        • #13
                          Weiße Seiten sind ein Zeichen von Parse errors.
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            Hey,
                            sorry ich finde den Fehler nicht ...

                            Kommentar


                            • #15
                              [MAN]error_reporting[/MAN]
                              --

                              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                              --

                              Kommentar

                              Lädt...
                              X