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

  • sdcleitung
    hat ein Thema erstellt PHP DB Einträge Alphabetisch ordnen.

    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.

  • sdcleitung
    antwortet
    Hey,
    danke ... ich probiere es gleich mal aus aber muss das gesammte Script neu installieren das hat es nämlich durch server probleme zerschossen -.- .... Ich melde mich dann

    Viel Spaß bei deiner USt-Erklärung

    Einen Kommentar schreiben:


  • Arne Drews
    antwortet
    Nach was willst Du sortieren?
    Ich nehm mal nur für'n Beispiel an nach ID.
    Dann würde ich persönlich das Array so aufbauen:
    PHP-Code:
    $items[$sql['Id']]['datum'] = $sql['datum'];
    $items[$sql['Id']]['question'] = $sql['question'];
    $items[$sql['Id']]['answer'] = $sql['answer']; 
    Dann einfach eien Sortierfunktion von PHP nutzen und Du solltes das gewünschte Ergebnis erhalten.

    Nach ID war jetzt nur'n Beispiel.
    Je nachdem, nach was Du sortieren willst, würde ich das Element als Key für das Array verwenden...

    Keine Ahnung was die anderen dazu sagen, vielleicht haben die ja noch was besseres.
    Mir fällt im Moment nur das auf die Schnelle ein, bin nämlich etwas beschäftigt (USt-Erklärung is überfällig...)

    Einen Kommentar schreiben:


  • sdcleitung
    antwortet
    Hey,
    benutze ich doch...:

    PHP-Code:
                $items[] = Array(
                    
    "id" => $sql['Id'],
                    
    "answer" => $sql['answer'],
    "question" => $sql['question'],
                    
    "datum" => $sql['datum'],
                ); 
    Der "sortier" Code:
    PHP-Code:
                foreach ($items as $entry) {
                    if (
    false === isset ($ordered[$entry[0]])) {
                        
    $ordered[$entry[0]] = array ();
                    }
                    
    $ordered[$entry[0]][] = $entry;
                } 
    Er soll eben beim "sortier" Code nur die Frage benutzen, also den ersten Buchstaben der Frage. Und das weiß ich nicht wie ich das in dem "sortier" Code angeben kann ....

    Einen Kommentar schreiben:


  • Arne Drews
    antwortet
    Warum verwendest Du dafür auch zwei Arrays?
    Verwende ein mehrdimensionales assoziatives Array...

    Einen Kommentar schreiben:


  • sdcleitung
    antwortet
    Hey,
    nachdem ich jetzt mal überlegt habe geht das ganze so nicht ... Wenn ich zwei Arrays benutze in dem einen nur die Frage in dem anderen Datum, Antwort, ... und nur das erste geordnet wird habe ich bei der Ausgabe das Problem, dass z.B. bei Frage 1 die Antwort von Frage 2 steht, weil die Reihenfolge der Fragen durch das Ordnen ja geändert wird ...

    also stehe ich wieder vor dem Problem, dass ich beim foreach aus dem Array nur den einen Teil benutzen dürfte ... oder?

    Einen Kommentar schreiben:


  • sdcleitung
    antwortet
    Hey,
    ja wie ne for schleife geht weiß ich auch ...

    aber iwie check ichs grad nich wie ichs machen soll.... ich glaube ich geh jetzt erstmal schlafen und überlege morgen mal drüber ...

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Dann mein lieber wird es echt Zeit, dass Du Dich mal mit den Grundlagen, speziell den Schleifen auseinandersetzt. Da dieses Thema, Dir täglich wiederbegegnen wird, sehe ich es eigentlich nicht ein, jetzt hier Dein Problem zu lösen, wenn es nur daran hapert.

    Einen Kommentar schreiben:


  • sdcleitung
    antwortet
    Hey,
    naja es geht zwar mit dem Array aber sieht ja nicht grad toll aus ....

    Habe mal überlegt ich müsste angeben sobald das nächste item kommt soll eine zahl hochgezählt werden und dann eben $set[$count] (mit einer for Schleife ???) weiß aber nicht wirklich wie ich das machen soll das er es für jeden item eintrag eins hochzählt

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Auf dasselbe. Ist der Alternativansatz.
    Wenn Du aber templatebasierte Ausgaben machst, sehe ich nicht so recht das Problem, dass dazwischen immer noch statischer Code stehen soll.

    Einen Kommentar schreiben:


  • sdcleitung
    antwortet
    Hey,
    zu a: Das mit den Links war nur ein Beispiel, es sind schätze ich jetzt mal 30-40 Zeilen Code (HTML + php Variablen, das was eben in eine TPL rein gehört) und das jetzt alles in ein Array zu packen wäre wohl wirklich nicht gerade gut ....

    zu b: Auf was bezieht sich die Antwort?

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    a) ein Array aller fertigen Links erstellen und dann implode und echo
    b) Doch eine Schleife benutzen und ersten bzw. letztes Element auswerten (im einfachsten Fall geht das mit einem numerischen Zähler).

    Einen Kommentar schreiben:


  • sdcleitung
    antwortet
    Hey,
    ok die letze Frage hat sich eventuell erledigt wenn ich das hier geschafft habe,
    ich gebe die Fragen ja so aus:
    PHP-Code:
    echo implode (' <br /> ' $set); 
    Problem allerdings, dass sehr viel Code "außen herum" sein müsste,
    also als Beispiel
    PHP-Code:
    <a href="http://google.de">{$set}</a
    habe da jetzt mal zum verständnis set reingesetzt, denn da müsste es eben hin aber so stimmt es ja nicht, wie kann ich das machen, kann ja nicht einfach das implode da rein setzen sonst wäre alle Fragen eines Buchstabes ein Link

    Wie kann ich das machen ....?

    Einen Kommentar schreiben:


  • sdcleitung
    antwortet
    Hey,
    vielen Dank, habe ja hier ein fettes Buch aber joa bin nich umbedingt so der theorie typ aber werde darin jetzt wohl doch weiter lesen ^^

    Habe jetzt allerdings ein Problem ich habe zwei foreach(es) deshalb wird das "Zeugs", klar, zweimal ausgegeben:

    PHP-Code:
    foreach ($this->items AS $item) { 
    und:
    PHP-Code:
    foreach ($this->ordered as $character => $set) { 
    ich kann das erste foreach allerdings nicht löschen, da sonst zwei Funktionen komischerweiße nicht funktionierten (habe die Variable $item zu $this->items gemacht)

    Hättest du da auch eine Lösung, z.B das ich das zweite eben nicht als foreach da stehen lasse sondern nur das aus den Klammern, aber das kann ich ja nicht einfach so da stehen lassen:

    PHP-Code:
    $this->ordered as $character => $set 
    oder?

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Bitte dringendst Grundlagen lernen! Hier findest Du diverse Quellen.

    Dieses Versprechen nehme ich Dir hiermit ab!

    PHP-Code:
    echo implode (' | ' array_keys ($this->ordered)); 
    Thats it.

    Einen Kommentar schreiben:

Lädt...
X