Array wird nicht korrekt sortiert

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

  • Array wird nicht korrekt sortiert

    Moin!

    Ich habe ein recht simples Script, das lediglich eine Textdatei mit vielen verschiedenen Nicknames einliesst und diese dann sortiert ausgeben soll.

    Leider funktioniert das Sortieren absolut nicht so wie ich es will.

    Diese Datei enthällt alle zu sortierenden Namen. Sie wird in ein Array eingelesen und dann mit sort() sortiert.

    Das Ergebnis sieht folgendermassen aus:

    -Luna-
    -Sonnenblume-
    @-yla
    ACAngel
    Angel20
    Aniol
    Annachen
    AsleyLou
    Baby****************22
    BleuCiel
    Bunnyodenbach2
    Crazies
    CrystalSun
    Dancemaus
    Darthexe
    DonCamilla
    Engelschn
    FatalTragedy
    HotGurl
    HotSun
    Housemastress
    Idgie21w
    JennyEngel
    Kyra
    KyraLatina
    LilJul
    LisaLysann
    Mimi501
    NASTY
    NessiMaus
    Puschlmiez
    Sanee
    Schnaggel
    ************yhexe
    Sir_Dogs_Lady
    Softeis
    Tabs1980
    Tauchmaus1
    Tiger-****************y
    _Keks_
    aline1st
    beatzbaby
    bettdeck
    birgitt_75
    fire-fly-****************
    kl0brille
    latina.it
    mädchen01
    manou1de
    rechenhexe
    silet
    yamuna1611
    zett
    Anfangs sieht es ja noch ganz gut aus, aber irgendwo kommt ein Bruch und die Sortierung ist Unsinn. Könnte es an einigen Sonderzeichen liegen? Ich kann kein System entdecken.

    Für Hilfe wäre ich sehr dankbar!
    Zuletzt geändert von Kobayashi; 04.08.2003, 00:20.

  • #2
    Poste mal bitte das Skript...
    mfg
    Günni


    Praxis: Jeder kann´s, aber keiner weiß wie´s geht...
    Theorie: Jeder weiß wie´s geht, aber keiner kann´s ...
    Microsoft vereint Praxis und Theorie: Nix geht und keiner weiß warum
    City-Tiger - Online durch die Straßen tigern...

    Kommentar


    • #3
      <?
      $auswahl = $_POST['auswahl'];

      // Dateien je nach Auswahl einlesen
      foreach ($auswahl as $wahl) {
      switch ($wahl) {
      case "f":
      $schluessel = 'frauen.txt';
      $liste = file($schluessel);
      break;

      case "m":
      $schluessel = 'maenner.txt';
      $liste = file($schluessel);
      break;

      case "g";
      $schluessel = 'gruppen.txt';
      $liste = file($schluessel);
      break;

      case "a":
      $maenner = file('maenner.txt');
      $frauen = file('frauen.txt');
      $liste = array_merge($maenner, $frauen);
      break;
      }
      }

      // Liste alphabetisch sortieren
      sort($liste);

      // Tabellencode erstellen
      foreach ($liste as $name) {
      echo "<tr><td><a href=\"user/".$name.".htm\" target=\"hauptfenster\">".$name."</a></td></tr>";
      }
      ?>

      Kommentar


      • #4
        Hi,
        das Skript arbeitet wie erwartet !

        Case sensitiv

        ich hab das Skript mal etwas umgeschrieben...
        jetzt wird jeder Anfangsbuchstabe in ein großen Buchstaben umgewandelt.

        PHP-Code:
        $wahl $_GET['auswahl'];

        // Dateien je nach Auswahl einlesen
        switch ($wahl) {
            case 
        "f":
            
        $schluessel 'frauen.txt';
            
        $liste file($schluessel);
            break;
            
            case 
        "m":
            
        $schluessel 'maenner.txt';
            
        $liste file($schluessel);
            break;
            
            case 
        "g";
            
        $schluessel 'gruppen.txt';
            
        $liste file($schluessel);
            break;
            
            case 
        "a":
            
        $maenner file('maenner.txt');
            
        $frauen file('frauen.txt');
            
        $liste array_merge($maenner$frauen);
            break;
        }

        while( list( 
        $key$val) = each$liste) ){
            
        $val{0} = strToUpper$val{0});
            
        $liste[$key] = $val;
        }

        // Liste alphabetisch sortieren
        sort($listeSORT_STRING);

        echo 
        "<table>";
        // Tabellencode erstellen
        foreach ($liste as $name) {
            echo 
        "<tr><td><a href=\"user/".$name.".htm\" target=\"hauptfenster\">".$name."</a></td></tr>";

        echo 
        "</table>"
        Schöne Grüße Bo

        Kommentar


        • #5
          Moin!

          Vielen Dank für die Hilfe. Allerdings bekomme ich jetzt folgende Fehlermeldung:
          Warning: Variable passed to each() is not an array or object in c:\apache\htdocs\test\auswahl.php on line 60

          Warning: sort() expects parameter 1 to be array, null given in c:\apache\htdocs\test\auswahl.php on line 66

          Warning: Invalid argument supplied for foreach() in c:\apache\htdocs\test\auswahl.php on line 69
          Und das rührt irgendwie von dieser neuen Anweisung (Beginn: Zeile 60) her:

          PHP-Code:
          while( list( $key$val) = each$liste) ){
              
          $val{0} = strToUpper$val{0});
              
          $liste[$key] = $val;

          Kommentar


          • #6
            hmm, hast du meinen code komplett so übernommen ?

            ich hab ganz oben noch das $_POST in ein $_GET umgewandelt, allerdingst nur zum testen bei mir...

            du solltest noch einen default case bei deiner switch anweisung erstellen..
            damit auch ohne eine angabe etwas aufgeführt wird.

            ansonsten könntest du mit
            PHP-Code:
            if( is_array$liste) ){

            // hier die schleifen usw. die auf das array $liste zugreifen


            Schöne Grüß Bo

            Kommentar


            • #7
              Ja, den Code habe ich ohne Änderung übernommen. POST bzw. GET habe ich angepasst. Wie's aussieht weisst die Fehlermeldung doch darauf hin, dass die Variable kein Array ist, oder?

              Ich probiere den neuen Vorschlag nochmal aus....

              Kommentar


              • #8
                Ich nochmal!

                Also, wenn ich als PHP-Anfänger die Sache richtig verstehe wird in deinem Codeschnipsel
                PHP-Code:
                while( list( $key$val) = each$liste) ){
                    
                $val{0} = strToUpper$val{0});
                    
                $liste[$key] = $val;

                die Variable nicht als Array behandelt, oder zumindest nicht mehr als Array ausgegeben. Deswegen beschwert sich später sort(), dass es keinen Array zum sortieren bekommt.

                Korrekt?

                Kommentar


                • #9
                  nö,

                  liste bleibt ein array, nur muss ich die ganze liste mit den einzelden werten durchlaufen damit ich die werte im array verändern kann.

                  poste am besten noch mal deinen kompletten code.

                  ich hab mein skript ja bei mir getestet und hier funzt es!

                  der fehler den du bekommst bedeutet das die variable $liste bei dir leer ist.

                  also wird $liste garkein wert/array zugeteilt
                  der fehler liegt also an der zuweisung der liste.

                  Kommentar


                  • #10
                    Okay, hier ist der komplette Code (mit einigem HTML):
                    PHP-Code:
                    <table>
                    <tr>
                    <td>
                    <form action="auswahl.php" name="auswahl" method="post">
                    <select name="auswahl[]" size="1" class="formularfeld" width="60">
                    <option value="f">Frauen</option>
                    <option value="m">M&auml;nner</option>
                    <option value="a">Frauen+M&auml;nner</option>
                    <option value="g">Gruppen</option>
                    </select>
                    <input type="submit" value="Go" class="okbutton">
                    </form>
                    </td>
                    </tr>

                    <?
                    $auswahl = $_POST['auswahl'];

                    foreach ($auswahl as $wahl) {
                       switch ($wahl) {
                          case "f":
                             $schluessel = 'frauen.txt';
                             $liste = file($schluessel);
                          break;

                          case "m":
                             $schluessel = 'maenner.txt';
                             $liste = file($schluessel);
                          break;

                          case "g";
                             $schluessel = 'gruppen.txt';
                             $liste = file($schluessel);
                          break;

                    // Wenn Maenner und Frauen in einer Liste gezeigt werden sollen:
                    // Männer einlesen, Frauen einlesen, Arrays kombinieren
                          case "a":
                             $maenner = file('maenner.txt');
                             $frauen = file('frauen.txt');
                             $liste = array_merge($maenner, $frauen);
                          break;
                       }
                    }
                             
                    // Liste alphabetisch sortieren
                             sort($liste);
                             
                    // Tabellencode erstellen
                             foreach ($liste as $name) {
                                echo "<tr><td><a href=\"user/".$name.".htm\" target=\"hauptfenster\">".$name."</a></td></tr>";
                             }   
                    ?>
                    </table>

                    Kommentar


                    • #11
                      hab mal das ganze skript überarbeitet..
                      übernehme es 1:1 wie es ist.

                      PHP-Code:
                      <table>
                      <tr>
                      <td>
                      <form action="<?php echo $_SERVER['PHP_SELF']; ?>" name="auswahl" method="post">
                      <select name="auswahl[]" size="1" class="formularfeld" width="60">
                      <option value="f">Frauen</option>
                      <option value="m">M&auml;nner</option>
                      <option value="a">Frauen+M&auml;nner</option>
                      <option value="g">Gruppen</option>
                      </select>
                      <input type="submit" name="send" value="Go" class="okbutton">
                      </form>
                      </td>
                      </tr>

                      <?
                      function open_file( $file){
                          if( is_readable( $file) ){
                              $result = file( $file);
                          } else {
                              echo "Datei wurde nicht gefunden! ($file)";
                              $result = false;
                          }
                          return $result;
                      }
                      if( isset( $_POST['send'] ) ){
                          $auswahl = $_POST['auswahl'];
                          
                          foreach ($auswahl as $wahl) {
                             switch ($wahl) {
                                case "f":
                                   $liste = open_file('frauen.txt');
                                break;
                          
                                case "m":
                                   $liste = open_file('maenner.txt');
                                break;
                          
                                case "g";
                                   $liste = open_file('gruppen.txt');
                                break;
                          
                          // Wenn Maenner und Frauen in einer Liste gezeigt werden sollen:
                          // Männer einlesen, Frauen einlesen, Arrays kombinieren
                                case "a":
                                   $maenner = open_file('maenner.txt');
                                   $frauen = open_file('frauen.txt');
                                   $liste = array_merge($maenner, $frauen);
                                break;
                             }
                          }
                          
                          if( is_array( $liste) ){
                              while( list( $key, $val) = each( $liste) ){
                                  $val{0} = strToUpper( $val{0});
                                  $liste[$key] = $val;
                              }
                              
                              // Liste alphabetisch sortieren
                              sort($liste);
                              
                              // Tabellencode erstellen
                              foreach ($liste as $name) {
                                  echo "<tr><td><a href=\"user/".$name.".htm\" target=\"hauptfenster\">".$name."</a></td></tr>";
                              }
                          } else {
                              echo "\$liste ist leer.";
                          }
                      }
                      ?>
                      </table>
                      Schöne Grüße Bo

                      Kommentar


                      • #12
                        Moin!

                        @ Bo: Ich habe dein Script 1:1 übernommen, und es sortiert daß es eine Freude ist!
                        Dafür schonmal vielen Dank!

                        Einziges Manko: Beim allerersten Funktionsaufruf wird keine Liste ausgegeben, erst beim zweitenMal wird etwas ausgegeben. Muss eventuell eine Variable schon zu Beginn initialisiert werden?

                        Ausserdem würde ich gerne wissen, wo in meinem Script der Wurm drinw ar. Was hat die merkwürdige Sortierung verursacht? Kann mir das jemand erklären?

                        MfG
                        Kobayashi

                        Kommentar


                        • #13
                          1. ich hab im meinem 1. post geschrieben warum es so ausgegeben wird.
                          case sensitiv = unterscheidung von groß klein schreibung!
                          das bedeutet zuerst werden alle großbuchstaben a-z sortiert und danach alle kleinen buchstaben !! davor, in der mitte und danach sind noch einige sonderzeichen

                          2. damit beim ersten aufruf auch eine liste ausgegeben wird muß die switchh anweisung einen default case zugewiesen bekommen.

                          anstatt
                          PHP-Code:
                          case: { // tue dies und das; } 
                          benutze:
                          PHP-Code:
                          default: { // tue dies und das; } 
                          damit auch ohne eine usereingabe eine liste ausgegeben wird.
                          lege diesen default case ganz unten bei deiner switch anweisung an.

                          Ich hoffe du weißt jetzt bescheid...

                          Kommentar


                          • #14
                            Moin!

                            Sowas, ich muss blind gewesen sein. Die unterschiedliche Auflistung nach Gross- und Kleinschreibung ist mir ü-ber-haupt nicht aufgefallen....

                            Okay, ich weiss jetzt Bescheid. Vielen Dank nochmal für deine Bemühungen.

                            MfG
                            Kobayashi

                            Kommentar


                            • #15
                              Hätte ein 'natcasesort' über das Array nicht auch geholfen?

                              http://de3.php.net/manual/de/function.natcasesort.php
                              Konrad

                              In a world without walls and fences, who needs Windows and Gates ?
                              (Sun Microsystems)

                              Kommentar

                              Lädt...
                              X