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>";
?>