Array nach individueller String-Position sortieren

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

  • #16
    ich habe dich nicht verstanden.
    kannst du mal in den beispielen alle zeichen, die irrelevant sind, durch X oder so ersetzen?

    Kommentar


    • #17
      xxxAFxA3xx
      xxxAGxA4xx
      xxxAAxB3xx
      xxxADxB4xx
      xxxAExB5xx
      xxxASxC3xx
      xxxBSxA3xx
      xxxBSxB3xx
      ---45-67--

      Die Sortierung sollte absteigend nach den Positionen 4+5, dann 6+7 und evtl. 8 erfolgen.

      Die aktuelle Lösung läuft wunderbar, ignoriert jedoch die weitere automatische Anordnung/Sortierung des dem sortierten Zeichen (4,6) folgenden Zeichens (5,7) völlig - wie es bei der normalen sort()-Funktion üblich ist.
      Zuletzt geändert von elton; 16.08.2005, 20:27.

      Kommentar


      • #18
        Leider komme ich irgendwie nicht selbst auf die Lösung. Kann jemand helfen?

        Kommentar


        • #19
          ich habe dir gezeigt, wie man das mit 2 ziffern macht.
          jetzt musst du 4 durchläufe statt 2 machen, aber immer noch nach dem gleichen prinzip.

          Kommentar


          • #20
            leider bin ich kein Crack in Sachen PHP;

            Wie erreiche ich 4 Durchläufe? Ich kenne nur die while- oder foreach-Schleifen, diese Art von Funktion ist neu für mich.

            Wenn ich von 2 Durchläufen ausgehe und für 4 Durchläufe dementsprechend $nr = ($z ? 7 : 6 : 4 : 3) angebe (was sicher falsch ist?), gibt es "natürlich" eine Fehlermeldung. Wo muß ich ansetzen?

            Kommentar


            • #21
              *räusper*

              Code:
              Beispielcode: 01-AS-A345
              Nummerierung: 0123456789 (php-konform)
              Wenn ich das richtig verstanden habe, willst du - in dieser Reihenfolge - nach den Stellen 3, 6, 4, 7, 8 sortieren.

              Dann wäre es vielleicht sinnvoll, vor dem Sortieren sämtliche Strings so zu übersetzen, dass sie einfach mit strcmp verglichen (== mit sort sortiert) werden können:

              PHP-Code:
              // 1. Sortiererei als Präfix
              function myprefix($s)
              {
                return 
              $s{3}. $s{6}. $s{4}. $s{7}. $s{8};
              }
              function 
              mytrans($s)
              {
                
              // sortier-relevante Zeichen an den Anfang
                
              $s myprefix($s). $s;
              }
              array_walk($array'mytrans');
              sort($array);
              function 
              untrans($s)
              {
                
              $s substr($s5); // Präfix wieder abschneiden
              }
              array_walk($array'untrans'); 
              Vorteil: Die Transformation muss auf jedes Element genau zweimal angewendet werden; beim Sortieren ist das nicht genau definiert - kann seltener, aber auch ein gutes Stück öfter sein.

              Andere Methode: Man erstelle ein zweites Array mit dem Präfix (gleiche Funktion wie oben) und nutze array_multisort:
              PHP-Code:
              $keys = array();
              foreach(
              $array as $k=>$s$keys[$k] = myprefix($s);
              multisort($array$keys); 
              mein Sport: mein Frühstück: meine Arbeit:

              Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

              Kommentar


              • #22
                Beispielcode: 01-AS-A345
                Ich möchte die Teilenummern nach den Positionen 4+5 und 7+8 absteigend sortieren. Die Funktion von penizillin

                function cb_sort($a, $b, $z = false)
                {
                $nr = ($z ? 6 : 3);

                if ($a{$nr} == $b{$nr}) {
                return ($z ? 0 : cb_sort($a, $b, true));
                }

                return ($a{$nr} < $b{$nr}) ? -1 : 1;
                }
                funktioniert auch ganz gut, nur werden hier ausschließlich die Positionen 4 und 7 sortiert, so daß bei den Positionen 5+8 ein durcheinander (AF, AA, AD, AG, AC...) entsteht.

                Nun möchte ich innerhalb dieser Funktion zusätzlich die Position 5 noch nach der Position 4 (AA, AB, AC...), und die Position 8 nach der Position 7 (A2, A3, B1...) sortieren lassen.

                Mit dem Trinitätsoperator ?: schaffe ich das leider nicht...

                Kommentar


                • #23
                  Titus hat eine hervorragende lösung vorgeschlagen!

                  Kommentar


                  • #24
                    Wenn ich folgende Methode anwende
                    PHP-Code:

                    $array 
                    = array("01-BS-B345""01-BS-A345""01-AS-C345",
                    "07-AF-A348""08-AG-A455""02-AA-B367""03-AD-B465"
                    "06-AE-B535");

                    function 
                    myprefix($s)
                    {
                      return 
                    $s{3}. $s{6}. $s{4}. $s{7}. $s{8};
                    }
                    $keys = array();
                    foreach(
                    $array as $k=>$s$key[$k] = myprefix($s);
                    array_multisort($array$keys);

                    foreach (
                    $array as $value){
                    echo 
                    "$value<br> ";

                    erhalte ich die Fehlermeldung:

                    Warning: array_multisort() [function.array-multisort]: Array sizes are inconsistent...
                    Zuletzt geändert von elton; 21.08.2005, 18:18.

                    Kommentar


                    • #25
                      Diese Methode
                      PHP-Code:
                      $array = array("01-BS-B345""01-BS-A345""01-AS-C345"
                      "07-AF-A348""08-AG-A455""02-AA-B367""03-AD-B465"
                      "06-AE-B535");

                      // 1. Sortiererei als Präfix
                      function myprefix($s)
                      {
                        return 
                      $s{3}. $s{6}. $s{4}. $s{7}. $s{8};
                      }
                      function 
                      mytrans($s)
                      {
                        
                      // sortier-relevante Zeichen an den Anfang
                        
                      $s myprefix($s). $s;
                      }
                      array_walk($array'mytrans');
                      sort($array);
                      function 
                      untrans($s)
                      {
                        
                      $s substr($s5); // Präfix wieder abschneiden
                      }
                      array_walk($array'untrans');

                      foreach (
                      $array as $value){
                      echo 
                      "$value<br> ";

                      läuft zwar fehlerfrei, sortiert aber nur die 1. und 2. Position
                      01-AS-C345
                      01-BS-A345
                      01-BS-B345
                      02-AA-B367
                      03-AD-B465
                      06-AE-B535
                      07-AF-A348
                      08-AG-A455
                      Zuletzt geändert von elton; 21.08.2005, 18:18.

                      Kommentar


                      • #26
                        nutze die [ php]-tags des forums, damit der code leserlich aussieht.

                        Kommentar


                        • #27
                          danke für den hinweis, habe es geändert.

                          Kommentar


                          • #28
                            beachte bitte, dass der code so umgebrochen wird, dass man nicht horizontal scrollen muss. drum editiere dein post noch mal bitte.

                            zu dem problem - Titus ist eine kleinigkeit entgangen - die funktionen mytrans() und untrans() sollten das argument by reference und nicht by value übernehmen.

                            d.h.
                            PHP-Code:
                            # ...
                            function mytrans(&$s)
                            # ... 
                            und
                            PHP-Code:
                            # ...
                            function untrans(&$s)
                            # ... 
                            sonst werden die änderungen an den werten ja nicht wirksam.

                            Kommentar


                            • #29
                              Jetzt bin ich als Anfänger doch etwas ratlos. Wie genau müßten die Funktionen dann aussehen bzw. sich verändern?

                              Kommentar


                              • #30
                                schau dir die zwei zeilen genau an. ich habe jeweils ein (entscheidendes) symbol hinzugefügt.

                                Kommentar

                                Lädt...
                                X