Hey, eine geniale Funktion, Danke!
Ich glaube die pack' ich mal mit in die Schnipsel-Sammlung, wa?!![]()
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:
Viel Spaß damit.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>";
?>![]()
Geändert von phpBuddy (01.08.2007 um 16:40 Uhr) Grund: Code-Box durch PHP-Box ersetzt
Hey, eine geniale Funktion, Danke!
Ich glaube die pack' ich mal mit in die Schnipsel-Sammlung, wa?!![]()
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
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.
Grüße vom Griechen,
Cybergreek!
everygain Translator - eine Firefox-Erweiterung, damit der Grieche Euch besser versteht
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)