Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] String-Sortierprobleme

Einklappen

Neue Werbung 2019

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

  • [Erledigt] String-Sortierprobleme

    Hi,

    ich komme nicht weiter! Ich bin zu unerfahren!!!
    Und ich finde keinen besseren Titel!!!

    Mein Wunsch:

    Auf der Seite: KuG-Testseite | Startseite die Navigation "Reiseziele A-Z", die ich mit php erzeugt habe zu sortieren.

    Der Code bisher:
    PHP-Code:
    ...
    $nav_ordner './reisen/';  // Da stehen die Reisen drin.
    $nav_dir scandir($nav_ordner);
    $nav_reiseziel="";  // wegen error_reporting ;-)
    foreach($nav_dir as $nav_key => $nav_value
      {
      
    $nav_rausFALSE;
      
    $nav_pos=0;
      
    $nav_dateipfad "./data/".$nav_value// In diesem Ordner stehen nur die Variablen drin. Sind die selben wie in /reisen/ nur noch nicht geparsed.
    if (strlen($nav_dateipfad) > 11) {  // eben ohne ./data/  und  ../data/
     
    $nav_handle fopen ($nav_dateipfad"rb"); 
      while (! 
    $nav_raus) {
       
    $nav_zeile fgets($nav_handle);  
       
    $nav_pos strpos($nav_zeile"reiseziel");  // Die Variable $reiseziel aus /data/ holen
        
    if ($nav_pos 0) {   
         
    $nav_reiseziel substr($nav_zeile,14,strlen($nav_zeile)-17);
         
    $nav_raus true
        }
      }
      
    fclose($nav_handle);
      }
      
     
    $nav_dateiname str_replace(".php"""$nav_value);
     if (
    $nav_reiseziel==''){ $nav_anzeigeliste '';}
      else { 
      
    $nav_anzeigeliste "    <li><a title=\"Zu den Reiseinformationen über $nav_reiseziel.\" href=\"/reisen/".$nav_dateiname.".html\">$nav_reiseziel</a></li>\n"
      }
      echo 
    $nav_anzeigeliste;  
     }
    ... 

    Das erzeugt ganz prima die aktuelle Navigation. Nur leider ist die Reihenfolge durch den Dateinnamen bestimmt. Das macht ja die foreach-Schleife. Kann man überhaupt die "$nav_anzeigeliste" nach "$nav_reiseziel" sortiert ausgeben?

    Ich hatte da mal angefangen zu suchen und fand folgenden Ansatz:
    PHP-Code:
    ...
    if (
    $nav_anzeigeliste != ''){  
    $sortierarray preg_split('/(<[^>]*[^\/]>)/i'$nav_anzeigeliste, -1PREG_SPLIT_NO_EMPTY PREG_SPLIT_DELIM_CAPTURE);
    print_r($sortierarray);  }
    ... 
    Damit hatte ich schon einmal folgenden Code:
    Code:
    ...
    Array
    (
        [0] =>     
        [1] => <li>
        [2] => <a title="Zu den Reiseinformationen über zBerlin." href="/reisen/Berlin.html">
        [3] => zBerlin
        [4] => </a>
    
        [5] => </li>
        [6] => 
    
    )
    Array
    (
        [0] =>     
        [1] => <li>
        [2] => <a title="Zu den Reiseinformationen über Riga." href="/reisen/Riga.html">
        [3] => Riga
        [4] => </a>
        [5] => </li>
        [6] => 
    
    )
    ...
    Nun könnte man sicher nach Array[3] sortieren lassen und die arrays wieder als string generieren. Aber wie???
    Der höchste Lohn für unsere Bemühungen ist nicht das, was wir dafür bekommen, sondern das, was wir dadurch werden.
    Mein aktuelles Projekt bei idealseiten.de


  • #2
    Zitat von philosapiens Beitrag anzeigen
    Ich hatte da mal angefangen zu suchen und fand folgenden Ansatz:
    Die Daten zu dem Zeitpunkt erst zu sortieren, wäre reichlich unsinnig.


    Du willst nach den Dateinamen, die du aus dem Verzeichnis ausliest, sortieren - korrekt?
    Dann packe diese beim Auslesen in ein Array,
    sortiere dieses anschliessend,
    und durchlaufe es dann in einer Schleife, die den HTML-Code für die Ausgabe drumherum packt.

    Kommentar


    • #3
      Hi,

      erst einmal danke für die blitzschnelle Antwort!

      Zitat von ChrisB Beitrag anzeigen
      Du willst nach den Dateinamen, die du aus dem Verzeichnis ausliest, sortieren - korrekt?
      Naja, eben nicht. Nach den Dateinamen wird es ja jetzt sortiert. Ich lese die ja mit dem Script aus dem Ordner aus und gebe sie in der Reihenfolge, wie im Ordner, wieder. Sortieren würde ich gerne nach einer jeder Datei zugeordneten Variable: Dem Reiseziel. Diese Variable ist unabhängig vom Dateinamen.

      Beispiel:

      Dateiname: Berlin | Reiseziel: Berlin
      Dateiname: Berlin2 | Reiseziel: Berlin bei Nacht
      Dateiname: Berlin3 | Reiseziel: Ostern in Berlin
      Dateiname: Berlin4 | Reiseziel: Berlin Alexanderplatz

      So wird es aktuell angezeigt, also in der Navi nur das Reiseziel.
      Wie könnte ich die Reihenfolge von A-Z nach Reiseziel sortieren?
      Der höchste Lohn für unsere Bemühungen ist nicht das, was wir dafür bekommen, sondern das, was wir dadurch werden.
      Mein aktuelles Projekt bei idealseiten.de

      Kommentar


      • #4
        Zitat von philosapiens Beitrag anzeigen
        Sortieren würde ich gerne nach einer jeder Datei zugeordneten Variable: Dem Reiseziel.
        Und wo/wie findet diese Zuordnung statt?

        Wie könnte ich die Reihenfolge von A-Z nach Reiseziel sortieren?
        Vom Vorgehen her ganz analog.

        Da die Dateinamen auf jeden Fall eindeutig sind (innerhalb eines Verzeichnisses), könntest du die als Schlüssel für ein assoziatives Array nutzen - und deinen Sortierwert dann als Inhalt.
        Dann sortierst du das Array nach dem Inhalt, unter Beibehaltung der Schlüssel-Zuordnung - und gibst anschliessend die Schlüssel in der dann vorliegenden Reihenfolge aus, bspw. mittels einer foreach-Schleife.

        Welche vorgefertigten Möglichkeiten zum Sortieren es gibt - siehe Handbuch, Übersichtsseite zu Array-Funktionen.

        Kommentar


        • #5
          Danke für die Idee. Mal sehen, ob ich sie soweit auch umsetzen kann.

          Zitat von ChrisB Beitrag anzeigen
          Und wo/wie findet diese Zuordnung statt?
          In der foreach-Schleife Zeile:
          PHP-Code:
          $nav_dateipfad "./data/".$nav_value
          Die Schleife selber zerpflügt ja eigentlich den Ordner /reisen/
          PHP-Code:
          $nav_ordner './reisen/';  // Da stehen die Reisen drin.
          $nav_dir scandir($nav_ordner); 
          Der höchste Lohn für unsere Bemühungen ist nicht das, was wir dafür bekommen, sondern das, was wir dadurch werden.
          Mein aktuelles Projekt bei idealseiten.de

          Kommentar


          • #6
            Hi,

            irgendwie bekomme ich den benötigten mehrdimensionalen Array nicht definiert.

            Ich skizziere noch mal kurz, was ich gerne möchte:

            Die Ordnerstruktur:

            /reisen/Berlin.php
            /reisen/Prag.php
            /reisen/Riga.php

            /data/Berlin.php
            /data/Prag.php
            /data/Riga.php

            Im Ordner /reisen/ befinden sich die fertigen aufrufbaren Dateien.
            Im Ordner /data/ befinden sich namengleiche Dateien mit ausschließlich variablen zur weiteren Verarbeitung.

            Mein Ziel:

            Code:
            <li><a title="Zu den Reiseinformationen über Prag." href="/reisen/Prag.html">Prag</a></li>
            generiert aus:
            PHP-Code:
            <li><a title=\"Informationen zur Reise nach $reiseziel.\" href=\"/reisen/".$dateiname.".html\">$reiseziel</a></li> 
            Bisher bin ich noch Lichtjahre davon entfernt!

            Erreicht habe ich bisher mit folgenden Code:
            PHP-Code:
            <?php 
            $nav_ordner 
            './reisen/';
            $nav_dir scandir($nav_ordner);
            unset (
            $nav_dir[0]);
            unset (
            $nav_dir[1]);
            print_r ($nav_dir);

            $zahl count($nav_dir)+2;
              for(
            $count 2$count $zahl$count++)
              {
                
            $nav_dateipfad "./data/".$nav_dir[$count];
                
            $nav_raus false;

               
            $nav_handle fopen ($nav_dateipfad"rb"); 
               while (! 
            $nav_raus) {
               
            $nav_zeile fgets($nav_handle);  
               
            $nav_pos strpos($nav_zeile"reiseziel");  // Die Variable $reiseziel aus /data/ holen
                
            if ($nav_pos 0) {   
                 
            $nav_reiseziel substr($nav_zeile,14,strlen($nav_zeile)-17);
                 
            $nav_raus true;
                 
            $array_reiseziel = array();
                 
            $array_reiseziel[] = "$nav_reiseziel"
                 
            print_r ($array_reiseziel);
                }
              }
              
            fclose($nav_handle);

            foreach(
            $nav_dir as $nav_key => $nav_value){
            $nav_dateiname $nav_value;

            $array_dateiname = array();
            $array_dateiname[] = "$nav_dateiname";

            print_r ($array_dateiname); 
            }
            }

            print_r ($array_reiseziel);
            print_r ($array_dateiname);

            ?>
            Ergebnis:
            Array ( [2] => Berlin.php [3] => Prag.php [4] => Riga.php )

            Array ( [0] => zBerlin )


            Array ( [0] => Berlin.php ) Array ( [0] => Prag.php ) Array ( [0] => Riga.php ) Array ( [0] => Prag )


            Array ( [0] => Berlin.php ) Array ( [0] => Prag.php ) Array ( [0] => Riga.php ) Array ( [0] => Riga )


            Array ( [0] => Berlin.php ) Array ( [0] => Prag.php ) Array ( [0] => Riga.php )

            Array ( [0] => Riga )

            Array ( [0] => Riga.php )
            Irgendwie bekomme ich das benötigte Array nicht definiert. Ich denke es wäre sinnvoll ein Array zu bekommen, dass man nach Reiseziel sortieren kann. Aber wie bekomme ich die Dateinamen aus den Dateien im Ordner /reisen/ und die Werte der entsprechenden Variablen aus dem Ordner /data/ in dieses eine Array so rein, dass ich es auch noch nach Reiseziel sortieren könnte? Wie könnte ich dieses wahrscheinlich mehrdimensionale Array überhaupt erzeugen?

            Der höchste Lohn für unsere Bemühungen ist nicht das, was wir dafür bekommen, sondern das, was wir dadurch werden.
            Mein aktuelles Projekt bei idealseiten.de

            Kommentar


            • #7
              Nach 10 Minütiger Analyse weiß ich glaub ich was du willst^^

              Du willst dir am Schluss zwei arrays ausgeben lassen, nämlich
              Reiseziele: Array ( [0] => zBerlin [1] => Prag [2] => Riga)
              Dateinamen: Array ( [0] => Berlin.php [1] => Prag.php [2] => Riga.php)

              Dafür brauchst du aber keine multidimensionalen Arrays, außer du willst dort noch verscheide Eigenschaften reinpacken. Multidimensionale Arrays kann man ganz einfach mit $array["schlüssel"][] erzeugen. Sortieren kann man die mit array_multisort;

              Dies scheitert aber schon allein daran, dass du bei jedem Durchlauf der Schleife immer wieder die Arrays neu anlegst

              z.b. Z.31f.
              PHP-Code:
              $array_dateiname = array();
              $array_dateiname[] = "$nav_dateiname"
              Dieses Array vor der schleife anlegen, in der Schleife dann füllen.
              Es würde dir auch die Arbeit erleichtern, wenn du deinen Code sauber formatieren würdest, also Einrücken, z.b. ist nicht ersichtlich, dass die foreach-Schleife in der for drinnensteckt.

              Tipp für die zukunft: mehr kommentare^^

              Ich hoffe, dass ich dir weiterhelfen konnte. Wenns noch hackt, dann schreib mich mal im ICQ an. Nummer is in meinem Profil

              Mfg,
              MasterD

              Kommentar


              • #8
                Hi,

                erst einmal vielen Dank, dass Du Dir die Zeit genommen hast, meine Frage überhaupt zu verstehen! Aus Deiner Antwort entnehme ich, dass ich das Thema nicht gut genug erklärt habe. Daher hier noch die kleine aber entscheidende Ergänzung Deiner Schlussfolgerung:

                Zitat von MasterD Beitrag anzeigen
                Du willst dir am Schluss zwei arrays ausgeben lassen, nämlich
                Reiseziele: Array ( [0] => zBerlin [1] => Prag [2] => Riga)
                Dateinamen: Array ( [0] => Berlin.php [1] => Prag.php [2] => Riga.php)
                Das Ganze möchte ich mit dem Hintergrund, die Dateinamen in der Reihenfolge der Reiseziele sortiert uzu bekommen. Ob ich das dann mit den beiden Arrays überhaupt gewuppt bekomme ist mir auch noch nicht einmal klar.
                Vielen Dank für die Einladung zum privaten Kontakt. Da das Thema hier wohl nicht allzu interessant erscheint, werde ich gerne den Code aufräumen und Dir meine neuesten Erkenntnisse zukommen lassen. Es würde mich sehr freuen, wenn Du mir noch den ein oder anderen Tipp geben könntest.

                Wir lesen uns!

                philosapiens
                Der höchste Lohn für unsere Bemühungen ist nicht das, was wir dafür bekommen, sondern das, was wir dadurch werden.
                Mein aktuelles Projekt bei idealseiten.de

                Kommentar


                • #9
                  Hi,

                  bin fast fertig! Bräuchte vielleicht nur noch ganz kleinen Anschubs.

                  Ich habe das ganze mal jetzt doch versucht als mehrdimensionales array zu löschen. Den Ansatz habe ich hier kopiert: Mehrdimensionale Arrays - PHP-Kurs.com - PHP programmieren lernen

                  Mein Code:
                  PHP-Code:
                  $nav_ordner './reisen/';
                  $nav_dir scandir($nav_ordner);
                  unset (
                  $nav_dir[0]); // $nav_dir bereinigen um die beiden 
                  unset ($nav_dir[1]); // ersten Einträge ./reisen/ und ../reisen/

                  $array_reiseziel = array();
                  $zahl count($nav_dir)+2// Beginnen mit dem dritten Schlüssel 
                   
                  for($count 2$count $zahl$count++)
                   {
                    
                  $nav_dateipfad "./data/".$nav_dir[$count];
                    
                  $nav_ende_while_schleife false;
                    
                  $nav_handle fopen ($nav_dateipfad"rb"); 
                     while (! 
                  $nav_ende_while_schleife
                     {
                      
                  $nav_zeile fgets($nav_handle);  
                      
                  $nav_pos strpos($nav_zeile"reiseziel");  // Die Variable $reiseziel aus /data/ holen
                       
                  if ($nav_pos 0
                       {   
                        
                  $nav_reiseziel substr($nav_zeile,14,strlen($nav_zeile)-17);
                        
                  $nav_ende_while_schleife true;
                       } 
                  // Ende if
                     
                  // Ende while
                    
                  fclose($nav_handle);
                    
                  $array_reiseziel[$count] = "$nav_reiseziel"
                   } 
                  // Ende for

                  foreach ($array_reiseziel as $nr_reiseziel => $nav_reiseziel)
                  {
                    
                  $reisen1[] = array('reiseziel' => $nav_reiseziel);
                  }

                  foreach (
                  $nav_dir as $nr_dateiname => $nav_dateiname)
                  {
                    
                  $reisen2[] = array('dateiname' => $nav_dateiname);
                  }

                  print_r $reisen1 );
                  echo 
                  "<br />";
                  print_r $reisen2 ); 
                  Ausgabe:
                  Code:
                  Array ( 
                    [0] => Array ( [reiseziel] => zBerlin ) 
                    [1] => Array ( [reiseziel] => Prag ) 
                    [2] => Array ( [reiseziel] => Riga ) 
                    )
                  
                  Array ( 
                    [0] => Array ( [dateiname] => Berlin.php ) 
                    [1] => Array ( [dateiname] => Prag.php ) 
                    [2] => Array ( [dateiname] => Riga.php ) 
                    )
                  Mein Ziel ist jedoch:
                  Code:
                  Array ( 
                    [0] => Array ( [dateiname] => Prag.php [reiseziel] => Prag ) 
                    [1] => Array ( [dateiname] => Riga.php [reiseziel] => Riga ) 
                    [2] => Array ( [dateiname] => Berlin.php [reiseziel] => zBerlin ) 
                    )
                  Wie kann ich die beiden zusammenführen?
                  Mit [MAN]array_merge[/MAN] habe ich es bisher nicht hinbekommen.
                  Der höchste Lohn für unsere Bemühungen ist nicht das, was wir dafür bekommen, sondern das, was wir dadurch werden.
                  Mein aktuelles Projekt bei idealseiten.de

                  Kommentar


                  • #10
                    Warum benutzt Du nicht einfach assoziative Arrays? Der Code ist echt grausam!
                    --

                    „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


                    • #11
                      Hi,

                      Zitat von nikosch Beitrag anzeigen
                      Warum benutzt Du nicht einfach assoziative Arrays?
                      Wie würdest Du das gestalten?

                      Zitat von nikosch Beitrag anzeigen
                      Der Code ist echt grausam!
                      Stimmt! Was würdest Du ändern?
                      Der höchste Lohn für unsere Bemühungen ist nicht das, was wir dafür bekommen, sondern das, was wir dadurch werden.
                      Mein aktuelles Projekt bei idealseiten.de

                      Kommentar


                      • #12
                        assoziative Arrays
                        benutzen

                        PHP-Code:
                        $urls['Prag'] = 'Prag.html';
                        $ziele['Prag'] = 'Prag';

                        echo 
                        $ziele[$ort] , $urls[$ort]; 
                        Oder:
                        PHP-Code:
                        $ziele[]      = 'Prag';
                        $urls['Prag'] = 'Prag.html';

                        echo 
                        $ziele[$i] , $urls[$ziele[$i]]; 
                        Oder:
                        PHP-Code:
                        $urls['Prag'] = 'Prag.html';

                        echo 
                        $key $urls[$key]; 
                        --

                        „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


                        • #13
                          Danke für die Idee!
                          Aber wie würdest Du dann die beiden eigentlich von einander unabhängigen Daten zusammen sortiert werden sollen?

                          Dein erster Tipp:
                          PHP-Code:
                          $urls['Prag'] = 'Prag.html';
                          $ziele['Prag'] = 'Prag';
                          $urls['Berlin'] = 'Berlin.html';
                          $ziele['Berlin'] = 'Zehlendorf';

                          echo 
                          $ziele[$ort] , $urls[$ort]; 
                          Wie kann ich nun so sortieren, dass ich eine Navigation bekomme in der Reihenfolge:
                          Titel: Prag | url: Prag.html
                          Titel: Zehlendorf| url: Berlin.html

                          Weil ja eigentlich Berlin vor Prag sortiert werden würde. Oder?

                          Bei Deinem zweiten Tipp wäre es meinem Kenntnissstand ähnlich.

                          Den dritten Tipp versuche ich noch auf meine Bedürfnisse hin anzuwenden.
                          Ich würde es dann wie folgt versuchen zu schreiben:
                          PHP-Code:
                          $reisen['Berlin.html'] = 'Zehlendorf';
                          $reisen['Prag.html'] = 'Prag';
                          sort($reisen); 
                          Wäre das so sinnvoll?
                          Der höchste Lohn für unsere Bemühungen ist nicht das, was wir dafür bekommen, sondern das, was wir dadurch werden.
                          Mein aktuelles Projekt bei idealseiten.de

                          Kommentar


                          • #14
                            Fast. [MAN]asort[/MAN] wäre richtig. Das ist auuch die Antwort auf die andere Frage. Datensätze sortieren und dann durchlaufen. Bei Variante 1 und 2 kannst Du asort benuzten (für $ziele), bei Varainte 2 auch nur sort, bei Variante 3 ksort.

                            Zur letzten Frage: Das nur sinnvoll, wenn es keine 2 gleichen URLs für unterschiedliche Orte geben kann.
                            --

                            „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


                            • #15
                              Um deinen Code ein bisschen aufzuschönen, würde ich dir raten per array_filter die directory-punkte rauszulöschen, damit du nicht erst bei 2 anfangen musst.

                              PHP-Code:
                              $array array_filter($array,'__CleanArray');

                              function 
                              __CleanArray($data){
                                if(
                              $data != "." || $data != "..")
                                   return 
                              $data

                              Und statt dem Abbruchskriterium $nav_raus würde ich ein simples break; empfehlen

                              So far,
                              MasterD

                              Kommentar

                              Lädt...
                              X