Hilfe beim Sortieren eines Arrays

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

  • Hilfe beim Sortieren eines Arrays

    Hi,

    ich habe ein großes Problem mit einem Array, was ich einfach nicht so sortiert bekomme wie ich es brauche. Und zwar sieht mein Array derzeit so aus:

    Code:
    Array
    (
        [4] => Array
            (
                [name] => CD
                [parent] => 3
            )
    
        [5] => Array
            (
                [name] => DVD
                [parent] => 3
            )
    
        [6] => Array
            (
                [name] => Hörspiele
                [parent] => 4
            )
    
        [7] => Array
            (
                [name] => Musik
                [parent] => 4
            )
    
        [9] => Array
            (
                [name] => HipHop
                [parent] => 7
            )
    
        [8] => Array
            (
                [name] => Rock
                [parent] => 7
            )
    
    )
    jetzt möchte ich die Reihenfolge so ändern, dass jedes Element hinter der parent ID steht. In parent steht also der Array key, hinter dem das Element einsortiert werden muss. Das Array soll also so aussehen:

    Code:
    Array
    (
        [4] => Array
            (
                [name] => CD
                [parent] => 3
            )
    
        [6] => Array
            (
                [name] => Hörspiele
                [parent] => 4
            )
    
        [7] => Array
            (
                [name] => Musik
                [parent] => 4
            )
    
        [9] => Array
            (
                [name] => HipHop
                [parent] => 7
            )
    
        [8] => Array
            (
                [name] => Rock
                [parent] => 7
            )
    
        [5] => Array
            (
                [name] => DVD
                [parent] => 3
            )
    )
    Das Array wird durchlaufen und geprüft, ob es einen Eintrag gibt, bei dem parent = 4 ist, da der aktuelle Key 4 ist. Ist das der Fall, wird das Array hinter das aktuelle Array verschoben. In diesem Fall gibt es also den Key 6 mit einem parent 4 und muß verschoben werden.

    Die Keys lauten jetzt also: 4,6,5,7,9,8

    Key 7 hat ebenfalls den parent 4 und muss hinter die 6 verschoben werden, weil die ursprüngliche Reihenfolge beibehalten werden muss

    Die Keys lauten jetzt also: 4,6,7,5,9,8

    Der nächste key wäre die 5 und dazu gibt es keinen Eintrage in parent.

    Die Keys lauten jetzt also: 4,6,7,5,9,8

    Nun kommt Key 9 mit dem parent 7 und muss dorthin verschoben werden

    Die Keys lauten jetzt also: 4,6,7,9,5,8

    Key 8 hat ebenfalls den parent 7 und muss hinter die 9 verschoben werden

    Die Keys lauten jetzt also: 4,6,7,9,8,5


    weiß jemand wie das geht? Ich habe schon tausend Schleifen gebaut und es wird einfach nichts

    Viele Grüße

    webbies

  • #2
    du willst doch ne hierarchische struktur abbilden oder?
    Meiner meinung nach is das was du machst, nämlich ein hierarchische
    struktur in EINEM array abzubilden allein der grund dafür, dass
    du dir so schwer tust beim sortieren =)

    ich hoffe meine kritik war wenigstens ein bisschen konstruktiv

    Kommentar


    • #3
      Ich denke mal er holt sich das Array aus der Datenbank....Also man kann es sich auch einfach machen durch eine rekursiv aufgerufene Funktion.

      Hier eine kleine Hilfe (funktioniert mit PHP5):

      Datei: class.categories.inc.php
      PHP-Code:
      <?php
      class categories
      {
          
          private 
      $root 3// Defines the root key.
          
      private $data = array();
          
          public function 
      __construct(&$categories)
          {

              
      $this->data $this->sortCategories(&$categories,$this->root);

          }

          private function 
      sortCategories(&$categories,$level)
          {

              foreach(
      $categories as $key => $category)
              {

                  if (
      $category['parent'] == $level)
                  {

                      
      $result[$key] = $category;

                      if (
      $subcategories=$this->sortCategories($categories,$key))
                      {

                          foreach(
      $subcategories as $subkey => $subcategory)
                          {

                              
      $result[$subkey] = $subcategory;

                          }

                      }

                  }

              }

              if (
      is_array($result)) return $result;
              else return 
      false;

          }

          public function 
      printCategories()
          {
          
              
      print_r($this->data);

          }

      }
      Datei: cats.php
      PHP-Code:
      <?php
      require('class.category.inc.php');

      $categories = array
      (
          
      => array( 'name' => 'CD',    'parent' => 3),
          
      => array( 'name' => 'DVD''parent' => 3),
          
      => array( 'name' => 'Hörspiele''parent' => 4),
          
      => array( 'name' => 'Musik''parent' => 4),
          
      => array( 'name' => 'HipHop''parent' => 7),
          
      => array( 'name' => 'Rock''parent' => 7)
      );

      $categories = new categories($categories);
      $categories->printCategories();
      Das Ergebnis stimmt - zumindest bei Deinem Beispiel - mit dem gewünschten Ergebnis überein.

      EDIT: Die Laufzeit müsste O(n²) sein. Wahrscheinlich könnte man mit mehr Aufwand noch etwas effizienteres finden...


      Die beiden Files habe ich Dir gezipt an den Post angehangen.

      Viele Grüße

      -SLind
      Angehängte Dateien
      Zuletzt geändert von SLind; 12.10.2007, 08:02.

      Kommentar

      Lädt...
      X