 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
01.08.2007, 12:52
|
#1
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Weyhe
|
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 = strcmp( strtolower($b[$f[0]]), strtolower($a[$f[0]]) ); if ( $strc != 0 ){ return $strc; } break; case "a": $strc = strcmp( strtolower($a[$f[0]]), strtolower($b[$f[0]]) ); if ( $strc != 0 ){ 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( 1 => array( 'Nachname' => 'Muster', 'Name' => 'Otto', 'Alter' => 27, 'Skills' => array('PHP'=>8,'MySQL'=>6,'C++'=>2) ), 2 => array( 'Nachname' => 'Müller', 'Name' => 'Heinz', 'Alter' => 46, 'Skills' => array('PHP'=>2,'MySQL'=>9,'C++'=>9) ), 3 => 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($array, get_orderarray('Nachname,a|Name,a'))); echo "-------------------------------------<br>";
echo "Sortiert nach PHP-Skills absteigend, bei Gleichheit nach Alter aufsteigend:<br>"; print_r(arfsort($array, get_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($array, get_orderarray('MySQL,D|PHP,D|Alter,A'))); echo "-------------------------------------<br>";
echo "</pre>";
?>
Viel Spaß damit. 
Geändert von Rizzo (01.08.2007 um 16:40 Uhr).
Grund: Code-Box durch PHP-Box ersetzt
|
|
|
01.08.2007, 16:40
|
#2
|
|
TP-Moderator
Registriert seit: Aug 2004
Ort: Kaiserslautern
|
Hey, eine geniale Funktion, Danke! 
Ich glaube die pack' ich mal mit in die Schnipsel-Sammlung, wa?! 
__________________
#.Viele Grüße, Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
.
|
|
|
01.08.2007, 16:41
|
#3
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Weyhe
|
Zitat:
Zitat von Rizzo
Hey, eine geniale Funktion, Danke! 
Ich glaube die pack' ich mal mit in die Schnipsel-Sammlung, wa?! 
|
Meinetwegen gerne. 
|
|
|
01.08.2007, 16:44
|
#4
|
|
TP-Moderator
Registriert seit: Aug 2004
Ort: Kaiserslautern
|
Zitat:
Zitat von DSB
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. 
__________________
#.Viele Grüße, Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
.
|
|
|
01.08.2007, 16:49
|
#5
|
|
TP-Veteran
Registriert seit: Mar 2005
Ort: Weyhe
|
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.
|
|
|
01.08.2007, 17:17
|
#6
|
|
TP-Moderator
Registriert seit: Nov 2005
Ort: Köln
|
Zitat:
Zitat von DSB
...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!
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 13:08 Uhr.
|
 |