+ Antworten
Ergebnis 1 bis 6 von 6

Thema: Multidimensionale Arrays nach beliebigen Indexen sortieren

  1. #1
    DSB
    DSB ist offline
    TP-Veteran DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137

    Multidimensionale Arrays nach beliebigen Indexen sortieren

    Hallo TPler,

    bei größeren Arrays steht man häufig vor dem Problem eine Ausgabe nach bestimmten Kriterien zu verwirklichen.Bei mehrdimensionalen Arrays ist das schon eine recht komplexe Aufgabe. In den Kommentaren auf php.net habe ich eine schöne Routine gefunden, die ein Array nach beliebigen Indexen in beliebigen Ebenen sortieren kann. Diese habe ich noch etwas aufgebohrt, so dass man wählen kann, ob eine Sortierung jeweils auf- oder absteigend nach String- oder Zahlenlogik erfolgen soll. Ebenso ist eine Verschachtelung von Kriterien (ähnlich dem ORDER BY-Statement bei SQL) möglich.

    Ein Anwendungsbeispiel sagt mehr als 1000 Worte:
    PHP-Code:
    <?php
    function get_orderarray($order)
    {
            
    $order_arr =array();
            
    $orders=explode('|',$order);
            foreach (
    $orders as $o)
            {
                    
    $d=explode(',',$o);
                    
    $order_arr[]=array($d[0],$d[1]);
            }
            return 
    $order_arr;
    }

    // extended to allow sort direction per field sorted against
    function arfsort_func$a$b ){
      foreach( 
    $GLOBALS['__ARFSORT_LIST__'] as $f ) {
        switch (
    $f[1]) { // switch on ascending or descending value
          
    case "d":
            
    $strc strcmpstrtolower($b[$f[0]]), strtolower($a[$f[0]]) );
            if ( 
    $strc != ){
              return 
    $strc;
            }
          break;
          case 
    "a":
            
    $strc strcmpstrtolower($a[$f[0]]), strtolower($b[$f[0]]) );
            if ( 
    $strc != ){
              return 
    $strc;
            }
          break;
          case 
    "D":
            
    $strc = (floatval($b[$f[0]])<floatval($a[$f[0]])) ? -1:1;
            if (
    $b[$f[0]]!=$a[$f[0]])
            {
              return 
    $strc;
            }
          break;
          case 
    "A":
            
    $strc = (floatval($b[$f[0]])>floatval($a[$f[0]])) ? -1:1;
            if (
    $b[$f[0]]!=$a[$f[0]])
            {
              return 
    $strc;
            }
          break;
        }
      }
      return 
    0;
    }

    function 
    arfsort$a$fl )
    {
      
    $GLOBALS['__ARFSORT_LIST__'] = $fl;
      
    usort$a'arfsort_func' );
      return 
    $a;
    }

    /*
    Anwendung:
    $sortiertes array = arfsort( $array, get_orderarray($order));

    $order => 'feldname,Richtung+Typ|feldname2,Richtung+Typ|...'

    a=ascending (aufsteigend nach Stringlogik)
    d=descending (absteigend nach Stringlogik)
    A=ascending (aufsteigend nach Wertelogik)
    D=descending (absteigend nach Wertelogik)
    */

    // Anwendungsbeispiel

    $array=array(
    => array(
        
    'Nachname' => 'Muster',
        
    'Name' => 'Otto',
        
    'Alter' => 27,
        
    'Skills' => array('PHP'=>8,'MySQL'=>6,'C++'=>2)
        ),
    => array(
        
    'Nachname' => 'Müller',
        
    'Name' => 'Heinz',
        
    'Alter' => 46,
        
    'Skills' => array('PHP'=>2,'MySQL'=>9,'C++'=>9)
        ),
    => array(
        
    'Nachname' => 'Müller',
        
    'Name' => 'Otto',
        
    'Alter' => 24,
        
    'Skills' => array('PHP'=>8,'MySQL'=>7,'C++'=>2)
        )
    );

    echo 
    "<pre>";
    echo 
    "Array vorher:<br>";
    print_r($array);
    echo 
    "-------------------------------------<br>";
    echo 
    "Sortiert nach Nachname und anschließend nach Vorname aufsteigend:<br>";
    print_r(arfsort($arrayget_orderarray('Nachname,a|Name,a')));
    echo 
    "-------------------------------------<br>";

    echo 
    "Sortiert nach PHP-Skills absteigend, bei Gleichheit nach Alter aufsteigend:<br>";
    print_r(arfsort($arrayget_orderarray('PHP,A|Alter,A')));
    echo 
    "-------------------------------------<br>";

    echo 
    "Sortiert nach MySQL-Skills absteigend, dann nach PHP-Skills absteigend - bei Gleichheit nach Alter aufsteigend:<br>";
    print_r(arfsort($arrayget_orderarray('MySQL,D|PHP,D|Alter,A')));
    echo 
    "-------------------------------------<br>";

    echo 
    "</pre>";

    ?>
    Viel Spaß damit.
    Geändert von phpBuddy (01.08.2007 um 17:40 Uhr) Grund: Code-Box durch PHP-Box ersetzt
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  2. #2
    TP-Specialist phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    Hey, eine geniale Funktion, Danke!
    Ich glaube die pack' ich mal mit in die Schnipsel-Sammlung, wa?!

  3. #3
    DSB
    DSB ist offline
    TP-Veteran DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137
    Zitat Zitat von Rizzo Beitrag anzeigen
    Hey, eine geniale Funktion, Danke!
    Ich glaube die pack' ich mal mit in die Schnipsel-Sammlung, wa?!
    Meinetwegen gerne.
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  4. #4
    TP-Specialist phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts phpBuddy ist einer der Eckpfeiler des TP - ohne ihn geht nichts Avatar von phpBuddy
    Registriert seit
    Aug 2004
    Ort
    Kaiserslautern
    Beiträge
    4.678
    Zitat Zitat von DSB Beitrag anzeigen
    Meinetwegen gerne.
    Schon passiert
    Ich war mal so frei und hab' in deinem Beitrag die Code-Box durch 'ne PHP-Box ersetzt, wegen der hübschen Farben und der dadurch besseren Lesbarkeit.

  5. #5
    DSB
    DSB ist offline
    TP-Veteran DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE DSB ist ein richtiges Arbeitstier - DANKE Avatar von DSB
    Registriert seit
    Mar 2005
    Ort
    Weyhe
    Beiträge
    1.137
    Gerne.
    Es gibt eben immer etwas zu verbessern. Wäre ja sonst auch langweilig.

    Ich hoffe, mit der Funktion kann auch jemand etwas anfangen. Ich selbst habe mir bei der Thematik schon oft die Finger und Hirnwindungen verstaucht und musste mich letztlich mit Kompromissen zufrieden geben. Mit der Funktion habe ich selbst nun auch ein Universalmittel, was ich häufig einsetzen kann.
    Gruß, DSB
    Einfaches Backup/ Restore Deiner MySQl-Datenbank
    Zend Certified Engineer PHP5

  6. #6
    TP-Moderator Cybergreek lebt für das TP und seine User Cybergreek lebt für das TP und seine User Cybergreek lebt für das TP und seine User Cybergreek lebt für das TP und seine User Cybergreek lebt für das TP und seine User Cybergreek lebt für das TP und seine User Avatar von Cybergreek
    Registriert seit
    Nov 2005
    Ort
    Köln
    Beiträge
    1.604
    Zitat Zitat von DSB Beitrag anzeigen
    ...Ich hoffe, mit der Funktion kann auch jemand etwas anfangen....
    Ganz bestimmt! Ich brauche sie zwar grad im Moment nicht, aber die Erinnerung an diesen Thread ist (hoffentlich) dauerhaft im Kopf verankert! Und zur Not gibt es ja noch die Suche

    Thanks für's zur Verfügung stellen!
    Grüße vom Griechen,
    Cybergreek!

    everygain Translator - eine Firefox-Erweiterung, damit der Grieche Euch besser versteht

+ Antworten

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51