Multidim Array sortieren

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

  • Multidim Array sortieren

    Hallo Board,

    folgendes Array $submenu ist gegeben:

    Array
    (
    [0] => Array
    (
    [cat_id] => 36
    [parent_id] => 5
    [name] => Die Niederlande
    [file] => partners.php
    [urlvars] =>
    )

    [1] => Array
    (
    [cat_id] => 35
    [parent_id] => 5
    [name] => Japan
    [file] => partners.php
    [urlvars] =>
    )

    [2] => Array
    (
    [cat_id] => 37
    [parent_id] => 5
    [name] => Norwegen
    [file] => partners.php
    [urlvars] =>
    )

    ...

    Das Array beinhaltet ein Submenü. "name" sind Ländernamen.
    Wie kann ich das Array nun nach "name" sortieren? Es klappt einfach nicht. Folgendes habe ich ausprobiert:

    PHP-Code:
    array_multisort($submenuSORT_ASCSORT_STRING);
    echo 
    "<pre>";
    print_r($submenu);
    echo 
    "</pre>";
    $page->assign('submenu'$submenu); 

    Oder ist das die falsche Funktion ?

    Danke
    Pickel ? Übergewicht ? Depressionen ?
    Brot, Kartoffeln und Milch sind Gift!
    http://www.paleofood.de

  • #2
    http://www.php-resource.de/forum/sho...threadid=37531 sollte helfen
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Hallo,

      ja sollte es, aber tut es nicht

      PHP-Code:
      function multisort($array$criterias)
      {
        
      $sort_rule '';
        foreach(
      $criterias as $criteria)
        {
          foreach(
      $array as $row)
            
      $sort_array[$criteria['col']][] = $row[$criteria['col']];
          
      $sort_rule .= '$sort_array['.
            (
      is_numeric($criteria['col']) ? $criteria['col'] : "'".$criteria['col']."'").
            
      '], '.$criteria['dir'].',';
        }
        eval(
      "array_multisort($sort_rule".' $array);');
        return 
      $array;
      }


      if (
      $menu->returnHasSubmenu($cat_id)) {
          
      $submenu $menu->returnSubmenu($cat_id);
                      
      $order = array('col' => 'name','dir' => SORT_ASC);
             
      $page->assign('submenu'multisort($submenu$order));

      Ergibt die Notiz:

      Notice: Undefined index: n in ...\partners.php on line 36

      Parse error: parse error, unexpected ',' in D:\...partners.php(41) : eval()'d code on line 1

      Zeile 36: $sort_array[$criteria['col']][] = $row[$criteria['col']];

      Zeile 41: eval("array_multisort($sort_rule".' $array);');
      Pickel ? Übergewicht ? Depressionen ?
      Brot, Kartoffeln und Milch sind Gift!
      http://www.paleofood.de

      Kommentar


      • #4
        Hat sich erledigt.

        Habe deinen Kommentar in dem angegeben Thread ebenfalls befolgt.
        Daran lag es.

        Mrhappiness , du bist genial. Wirklich unglaublich.
        Pickel ? Übergewicht ? Depressionen ?
        Brot, Kartoffeln und Milch sind Gift!
        http://www.paleofood.de

        Kommentar


        • #5
          Ich hoffe ich darf nochmal etwas tiefergehendes fragen.
          Ich finde diese Funktion wirklich toll und würde sie gerne mit in meine Navigationsklasse aufnehmen.

          In der Navigationsklasse gibt es eine Funktion

          PHP-Code:
          function returnSubmenu($cat_id)
          {
                  
          $res =& $this->_db->query("SELECT cat_id, parent_id, name, file, urlvars
          FROM navigation_structure ns, navigation_translation nt
          WHERE (ns.parent_id = '"
          .$cat_id."')
          AND (ns.trans_id = nt.trans_id)
          AND (nt.lang = '"
          .$this->_language."')
          ORDER BY order_ ASC"
          );
                              
          while(
          $row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
                      
          $categories[] = $row;
                  }
                  return 
          $categories;
              } 
          // end func returnSubmenu 
          Jetzt habe ich so mein Problem mit Parameterlisten.
          Wie kann man obige Funktion abändern, so dass man wählen kann, ob $categories geordnet zurückgegeben wird oder nicht?

          Ich meine, falls ein 'Signal' übergeben wird zu ordnen, soll die Funktion "multisort" aufgerufen werden.
          Pickel ? Übergewicht ? Depressionen ?
          Brot, Kartoffeln und Milch sind Gift!
          http://www.paleofood.de

          Kommentar


          • #6
            ja dann gib doch ein "signal":
            PHP-Code:
            function returnSubmenu($cat_id$signal=NULL)
            {
               ....
               if(!
            is_null($signal)
               {
                   
            //tu was
               
            }

            oder was meintest du?
            Kissolino.com

            Kommentar


            • #7
              Also mein Problem ist, dass ich nicht verstehe wie man das am besten macht.

              Wenn die Funktion gesagt bekommt, die solle das Submenü auch noch sortieren wie muss dann die Parameterliste aussehen.
              Also bekommt sie als Signal Ja/Nein ? Wen ich das so mache

              function returnSubmenu($cat_id, $sort = false)

              und wahlweise true/false als zweites Argument übergebe. Wie teile ich ihr dann mit in welcher Reihenfolge und Spalte?

              Also wieviele Argumente brauche ich in der Parameterliste ?

              PHP-Code:
              function returnSubmenu($cat_id$sort false$order)
              {
                  
              $res =& $this->_db->query("

              SELECT cat_id, parent_id, name, file, urlvars
              FROM navigation_structure ns, navigation_translation nt
              WHERE (ns.parent_id = '"
              .$cat_id."')
              AND (ns.trans_id = nt.trans_id)
              AND (nt.lang = '"
              .$this->_language."')
              ORDER BY order_ ASC"
              );
                                  
              while(
              $row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
                  
              $categories[] = $row;
              }
                                              
              if (
              $order) {
                  return 
              $categories;
              } else {
                  return 
              $this->multisort($categories$order);
              }
              // end func returnSubmenu 
              So ist das doch nicht rightig, oder? Denn wenn ich nicht sortieren möchte muss man ja trotzdem noch ein drittes Argument übergeben.

              Zuletzt geändert von antman; 03.09.2004, 13:58.
              Pickel ? Übergewicht ? Depressionen ?
              Brot, Kartoffeln und Milch sind Gift!
              http://www.paleofood.de

              Kommentar


              • #8
                PHP-Code:
                function returnSubmenu($cat_id$order NULL)
                {
                $res =& $this->_db->query("

                SELECT cat_id, parent_id, name, file, urlvars
                FROM navigation_structure ns, navigation_translation nt
                WHERE (ns.parent_id = '"
                .$cat_id."')
                AND (ns.trans_id = nt.trans_id)
                AND (nt.lang = '"
                .$this->_language."')
                ORDER BY order_ ASC"
                );
                                    
                while(
                $row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
                    
                $categories[] = $row;
                }
                                            
                if (!
                is_null($order)) {
                    return 
                $categories;
                } else {
                    return 
                $this->multisort($categories$order);
                }
                    } 
                // end func returnSubmenu


                $order = array(array('col' => 'name''dir' => SORT_ASC));
                $page->assign('submenu'$menu->returnSubmenu($cat_id$order)); 
                Wie würde ich diese Funktion aufrufen, wenn icht sortiert werden soll?
                Zuletzt geändert von antman; 03.09.2004, 13:58.
                Pickel ? Übergewicht ? Depressionen ?
                Brot, Kartoffeln und Milch sind Gift!
                http://www.paleofood.de

                Kommentar


                • #9
                  PHP-Code:
                  function returnSubmenu($cat_id$order NULL)
                  {
                    
                  # alles bis zum return
                    
                  if (!is_null($order))
                      
                  $categories multisort($categories$order);
                    return 
                  $categories;

                  und als zweiten parameter übergibst du einfach das array mit den sortierkritierien

                  oder du lässt ihn weg, wenn nicht sortiert werden soll
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    oder du lässt ihn weg, wenn nicht sortiert werden soll
                    Und genau das verstehe ich nich. Wieso kann man den einfach weglassen?

                    Wenn man doch 2 Parameter in der Parameterliste angibt, muss man doch auch 2 übergeben. Ist das nicht wie in Java? Dort kann man doch einen Konstruktur überladen. Also mehrere gleichnamige Konstruktoren mit verschiedenen Parameterlisten haben.

                    Hat jemand mal ein Tutorial/Link dazu ?

                    Danke
                    Pickel ? Übergewicht ? Depressionen ?
                    Brot, Kartoffeln und Milch sind Gift!
                    http://www.paleofood.de

                    Kommentar


                    • #11
                      PHP-Code:
                      function returnSubmenu($cat_id$order NULL)
                      {
                        
                      # alles bis zum return
                        
                      if (!is_null($order))
                          
                      $categories multisort($categories$order);
                        return 
                      $categories;

                      Mus es nicht heißen:

                      PHP-Code:
                      $categories $this->multisort($categories$order); 
                      ?
                      Zuletzt geändert von antman; 03.09.2004, 14:11.
                      Pickel ? Übergewicht ? Depressionen ?
                      Brot, Kartoffeln und Milch sind Gift!
                      http://www.paleofood.de

                      Kommentar


                      • #12
                        Original geschrieben von antman
                        Und genau das verstehe ich nich. Wieso kann man den einfach weglassen?

                        Wenn man doch 2 Parameter in der Parameterliste angibt, muss man doch auch 2 übergeben.
                        Im Funktionskopf siehst du, dass hinter $order noch = NULL steht

                        wenn du beim Aufruf der Funktion jezt den zweiten Parameter weglässt, dann setzt PHP automatisch den im Funktionskopf definierten default-wert ein, in diesem Fall wäre das NULL


                        zu deiner frage nach $this->multisort: wenn du die funktion in die klasse gepackt hast, dann musst du das so aufrufen


                        ich könnte mir aber nicht vorstellen warum sowas in eine klasse gehört
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          Ich könnte mir aber nicht vorstellen, warum sowas in eine Klasse gehört.
                          Warum sollte sowas nicht in eine Klasse gehören? Doch wohl gerade soetwas. Das braucht man doch häufig. Wo sollte man es sonst hinpacken, wenn man das öfter braucht ?

                          Habe es in die Klasse Navigation gepackt.
                          Pickel ? Übergewicht ? Depressionen ?
                          Brot, Kartoffeln und Milch sind Gift!
                          http://www.paleofood.de

                          Kommentar


                          • #14
                            weil du das sortieren von mehrdimensionalenarrays wohl nichtnur für die navigation brauchst, wenn du es aber in diese klasse packst, dann brauchst du immer die gesamte klasse, nur um mal eben ein solches array sortieren zu können
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              Hmm,

                              du hast mal wieder völlig recht. Aber wohin sonst damit ?
                              Und wenn ich es nicht in diese Klasse packe, wie soll ich sie dann nutzen ?

                              Aber wenn ich mir das so recht überlege, dann ist das doch immer so.
                              Wenn ich z.B. die Klasse Math instanziere und eine Funktion Quadratwurzel nutze, dann brauche ich die anderen 300 Funktionen auch nicht.
                              Zuletzt geändert von antman; 03.09.2004, 14:50.
                              Pickel ? Übergewicht ? Depressionen ?
                              Brot, Kartoffeln und Milch sind Gift!
                              http://www.paleofood.de

                              Kommentar

                              Lädt...
                              X