Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] nach Kapitelnummer sortieren

Einklappen

Neue Werbung 2019

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

  • [Erledigt] nach Kapitelnummer sortieren

    Hi,

    ich baue ein Anwendung, in der unter Anderem Positionen angelegt werden können. (z.B. Bestellpositionen)
    Man kann eine Position an bestimmter Stelle einfügen, z.B unter "2". Hat "2" noch keine Unterpositionen, wird die neue Position "2.1". Das funktioniert soweit ganz gut, auch die Sortierung klappt - bis nach der 9ten Unterposition die "2.10" kommt, und in der Sortierung logischerweise zwischen "2.1" und "2.2" steht.

    Wie sortiere ich nun dieses Zahlenarray? Buchkapitel müssten doch ähnlich sortiert werden. Muss ich nun die Arrayelemente zerlegen und dann einzeln sortieren? Oder gibts eine feine PHP-Funktion, die das so kann? sort() und asort() bringen mich hier nicht so richtig weiter. sort_bookstyle() wäre die Richtige, die gibts wohl aber noch nicht

    Danke, Lars

  • #2
    Wie sieht denn die Struktur dazu aus? Wenn dein Array so aussieht:

    PHP-Code:
    $array[2] = "...";
    $array[2.1] = "..."
    dann wird das frickel-Arbeit.

    Würde es aber so aussehen

    PHP-Code:
    $array[2][0] = "...";
    $array[2][1] = "..."
    dann wäre das einfacher. Außerdem bräuchtest du dann zum hinzufügen keine "Berechnungen" mehr zu machen.

    Kommentar


    • #3
      Hi,

      in der Datenbank stehen die Zuordnungen in 2 Spalten: id, parent_id.

      Die einfache Abfrage auf die Datenbank und Anzeige als Tabelle läuft ohne Array. Die Ausgabe als verschachtelte Navigationsliste über ein mehrdimensionales Array, so wie deine zweite Möglichkeit.

      Also müsste ich das Array index-basiert sortieren? (Nachdem ich mir wieder ein Array zusammengebastelt habe)

      Lars

      Kommentar


      • #4
        Ich versteh dein Problem nicht. Du kannst die Sortierung doch die DB machen lassen? ORDER BY id, parent_id und fertig oder nicht?

        Kommentar


        • #5
          Na eben das geht ja nicht. Sobald ich die id`s 2.1 bis 2.9 vergeben habe und 2.10 anlege, wird dieser Eintrag nicht richtig sortiert (zwei komma eins null kommt nach zwei komma eins - richtig wäre aber zwei punkt zehn kommt nach zwei punkt neun)

          Lars

          Kommentar


          • #6
            Kannst du mal einen Ausschnitt deiner Daten zeigen?

            Kommentar


            • #7
              Hier mal die insert-Anweisung aus dem aktuellen MySQL-Dump:

              Code:
              INSERT INTO `position` (`id`, `parent`, `family`, `labelling`, `description`, `quantity`, `dimension_unit`, `unit_price`, `material`) VALUES
              ('1', '0', '2010110001', 'Zahnrad', 'Standardware, Maschinenersatzteil', 22, 'Stk.', 65, 'Stahl'),
              ('2', '0', '2010110001', 'Getriebe', 'ein echt schweres Ding', 1, 'Stk.', 7850, 'Verschiedene'),
              ('2.1', '2', '2010110001', 'Getriebegehäuse', 'sandgestrahlt, ohne Lackierung', 1, 'Stk.', 870, 'Stahlblech'),
              ('2.2', '2', '2010110001', 'Welle ABC', 'Antriebswelle', 4, 'Stk.', 127, 'Kupfer'),
              ...
              ('2.10', '2', '2010110001', 'Zahnrad XY', 'verzahnt sauber', 17, 'Stk.', 38, 'Stahl123'),
              ('2.11', '2', '2010110001', 'Haltewinkel', 'Befestigungsmaterial', 11, 'Stk.', 8, 'Stahl');
              family steht für die Auftragsnummer

              Lars

              Kommentar


              • #8
                ja wenn das so aussieht dann ist das auch kein wunder. Mach die ID einfach wie jeder normale Mensch als auto-Increment und leg dir bspw. ein Feld kapitel_nr an.

                Das könnte dann so aussehen:

                Code:
                ID | parent_ID | kapitel_nr
                1 | 0 | 1 // Kapitel 1
                2 | 1 | 1 // Kapitel 1.1
                3 | 1 | 1 // Kapitel 1.1.1
                4 | 0 | 2 // Kapitel 2
                /...
                20 | 4 | 11 // Kapitel 2.11

                Kommentar


                • #9
                  Da denke ich mal genauer drüber nach.

                  Das sieht mir im Moment auch noch nicht nach der richtigen Lösung aus. (nur zur Anmerkung: Kapitel 1.1.1 hätte doch dann 3|2|1, oder?)

                  Die Sortierung darüber ist auch nicht korrekt, denn wenn ich eine Position mittendrin einfüge, hat sie eine höhere id als die in der gewünschten Reihenfolge später kommenden. Und geht die Verschachtelung noch tiefer, kommt alles durcheinander. Dann nützt die Sortierung nach parentid, kapitelnr nichts mehr.

                  Die Sortierung über ein autoinc-Feld bringt mir in diesem Fall nichts.

                  Lars

                  Kommentar


                  • #10
                    Ich werde wohl meine Arrayfunktion bemühen, die mir auch die verschachtelte Liste erstellt. Damit wäre ich auch bei deinem Vorschlag:


                    Würde es aber so aussehen
                    PHP-Code:
                    $array[2][0] = "...";
                    $array[2][1] = "...";
                    Dann sortiere ich Index-basiert.

                    Ich poste dann mal meine Lösung.

                    Lars

                    Kommentar


                    • #11
                      Ja hast recht, in 1.1.1 ist ein Fehler.

                      Aber nichts desto trotz funktioniert das. Angenommen du willst die ersten 2 Ebenen darstellen:

                      Code:
                      SELECT * FROM tab as child LEFT JOIN tab as parent ON child.parent_id = parent.id WHERE parent.parent_id = 0 ORDER BY parent.kapitel_nr, child.kapitel_nr

                      Kommentar


                      • #12
                        Hallo,

                        sorry war gestern Nachmittag nicht mehr am Rechner.

                        Ich habe deine sql-Abfrage ausprobiert, als Ergebnis kommen nur die Unterelemente von Position 2, da 1 und 3 keine Kinder haben. Sortiert müsste aber über alle Ebenen werden, wahrscheinlich rekursiv. Das Ergebnis soll dann ja so aussehen:
                        1
                        2
                        2.1
                        2.2
                        ...
                        2.11
                        3
                        4
                        4.1
                        4.1.1
                        4.1.2
                        4.2
                        ...

                        Ich schreib mal meine Funktion um und poste sie dann. Dauert aber noch ein Weilchen

                        Lars

                        Kommentar


                        • #13
                          Hi!

                          So, habe es hinbekommen. Nach vieler Sucherei und Ausprobieren mit natsort(), natcasesort(), strnatcasecmp() und solcherlei Krams.

                          In der Datenbank liegen die Datensätze so vor:

                          id | parent_id | labelling
                          1 | 0 | Zahnrad
                          2 | 0 | Getriebe
                          2.1 | 2 | Getriebegehäuse
                          ...
                          2.5 | 2 | Welle
                          2.11 | 2 | Haken
                          usw.

                          Diese Sätze hole ich mit

                          PHP-Code:
                          $sql  'SELECT 
                                       id AS ID,
                                       parent AS parentID,
                                       labelling AS title
                                     FROM
                                       Position
                                     WHERE
                                       family='
                          .$_GET['sequence'].'
                                     ORDER BY
                                       id'

                          aus der Datenbank. 'sequence' ist hierbei die Auftragsnummer, so wird verhindert, dass doppelte Positionsangaben vorkommen (Position 1 gibt es ja in jedem Auftrag). Außerdem interessiert hier nur jeweils 1 Auftrag.

                          Das result schreibe ich in ein neues Array:

                          PHP-Code:
                          $result $db->query($sql);
                          while (
                          $row $result->fetch_assoc()){
                            
                          $inputArray[] = $row;

                          Nun definiere ich meine eigene Sortierfunktion:

                          PHP-Code:
                          function nat_case_sort($a$b) {
                            return 
                          strnatcasecmp($a["ID"],$b["ID"]);

                          Ist nicht wirklich meine eigene, hab die Anregung dazu von hier:
                          http://www.on-design.de/tutor/php/arraysort.php
                          Und den Schreibfehler hab ich gefunden mit Hilfe von
                          http://www.php.net/manual/de/function.usort.php

                          Na und zum Schluss rufe ich usort() mit meiner (jaja, nicht meiner, aber der von mir vorher definierten) Funktion auf und gebe es testweise aus:

                          PHP-Code:
                          usort($inputArray'nat_case_sort');

                          echo 
                          'sortiertes InputArray<pre>';
                          print_r $inputArray );
                          echo 
                          '</pre><br/>'
                          So läuft es prima, die Sortierung haut hin. 2.11 ist, wie gewünscht, nach 2.5 und nicht zwischen 2.1 und 2.2.

                          Und nach dieser Prozedur erstelle ich aus $inputArray ein hierarchisches mehrdimensionales Array, mit dessen Hilfe ich dann meine verschachtelte Liste zur Navigation baue.

                          Vielen Dank für deine Vorschläge,

                          Lars

                          Kommentar

                          Lädt...
                          X