Der Trick bei usort und Kolleginnen ist, dass man einer selbst geschriebenen Vergleichsfunktion zwei Parameter mitgibt.
Die Vergleichsfunktion vergleicht beide:
Ist der erste (in den Beispielen $a) kleiner als wie zweite, so gubt diese Funktion -1 zurück: usort tut dann nichts.
Ist der erste (in den Beispielen $a) genau so groß als der zweite, so gibt diese Funktion "0" zurück. usort tut dann nichts.
Ist der erste (in den Beispielen $a) größer als der zweite, so gibt diese Funktion "1" zurück. Usort tauscht dann um.
Auf einer ganzen Reihe solcher Vergleichs- und Umtauschaktionen basieren alle Sortieralgorythmen.
Meine Vergleichsfunktion für usort macht im Prinzip genau das, was Rolf geschrieben hat: Wenn sich das datum nicht unterscheidet wird nach UID sortiert. Unterscheidet sich auch die nicht, dann nach Prio, dto nach Prio2.
Ich habe noch eine Hilfsfunktion geschrieben, welche anders die in den Beispielen im Handbuch wenigstens sowohl Strings als auch Zahlenwerte verträgt und mit dem dritten Parameter $invers eine andere Sortierreihenfolge ermöglicht (es werden dann einfach $a und $b vertauscht...)
<?php
$arr[0]['UID'] = '5ea6c609473ab';
$arr[0]['Status'] = 'RW';
$arr[0]['Prio'] = 1;
$arr[0]['Prio2'] = 1;
$arr[0]['Datum'] = '2020-06-02';
$arr[0]['Menge'] = 1.00;
$arr[0]['Textpos'] = NULL;
$arr[0]['Bezeichnung'] = NULL;
$arr[0]['Einzelpreis'] = 15.00;
$arr[0]['Gesamtpreis'] = 15.00;
$arr[1]['UID'] = '5ea6c60947793';
$arr[1]['Status'] = 'RW';
$arr[1]['Prio'] = 1;
$arr[1]['Prio2'] = 1;
$arr[1]['Datum'] = '2020-04-02';
$arr[1]['Menge'] = 1.00;
$arr[1]['Textpos'] = NULL;
$arr[1]['Bezeichnung'] = NULL;
$arr[1]['Einzelpreis'] = 0.00;
$arr[1]['Gesamtpreis'] = NULL;
$arr[3]['UID'] = '5ea6c60947793';
$arr[3]['Status'] = 'F';
$arr[3]['Prio'] = 1;
$arr[3]['Prio2'] = 2;
$arr[3]['Datum'] = '2020-04-02';
$arr[3]['Menge'] = 1.00;
$arr[3]['Textpos'] = NULL;
$arr[3]['Bezeichnung'] = NULL;
$arr[3]['Einzelpreis'] = 100.00;
$arr[3]['Gesamtpreis'] = NULL;
echo "\n================================\n";
var_export( $arr );
echo "\n================================\n";
echo "Nach Sortieren:";
echo "\n================================\n";
function myCompare ($a, $b, $invers = false ) {
if ( $invers ) {
$c=$a; $a=$b; $b=$c; unset( $c );
}
if ( is_string( $a ) and is_string( $b ) ) {
return strcmp( $a, $b );
} elseif ( is_numeric( $a ) and is_numeric( $b ) ) {
if ( $a == $b ) return 0;
if ( $a < $b ) return -1;
if ( $a > $b ) return 1;
}
trigger_error( 'Nicht vorgesehener Datentyp in Funktion myCompare. Erlaubt sind string und numeric', E_USER_ERROR );
}
function compare_Datum_UID_Prio_Prio2 ( $a, $b ) {
$invers['Datum'] = false;
$invers['UID'] = false;
$invers['Prio'] = true;
$invers['Prio2'] = true;
foreach ( [ 'Datum', 'UID', 'Prio', 'Prio2' ] as $itemProp ) {
$r = myCompare( $a[$itemProp], $b[$itemProp], $invers[$itemProp] );
if ( 0 != $r ) {
return $r;
}
}
}
usort($arr, 'compare_Datum_UID_Prio_Prio2' );
var_export( $arr );
echo "\n================================\n";
Meine Ausgaben:
================================
array (
0 =>
array (
'UID' => '5ea6c609473ab',
'Status' => 'RW',
'Prio' => 1,
'Prio2' => 1,
'Datum' => '2020-06-02',
'Menge' => 1.0,
'Textpos' => NULL,
'Bezeichnung' => NULL,
'Einzelpreis' => 15.0,
'Gesamtpreis' => 15.0,
),
1 =>
array (
'UID' => '5ea6c60947793',
'Status' => 'RW',
'Prio' => 1,
'Prio2' => 1,
'Datum' => '2020-04-02',
'Menge' => 1.0,
'Textpos' => NULL,
'Bezeichnung' => NULL,
'Einzelpreis' => 0.0,
'Gesamtpreis' => NULL,
),
3 =>
array (
'UID' => '5ea6c60947793',
'Status' => 'F',
'Prio' => 1,
'Prio2' => 2,
'Datum' => '2020-04-02',
'Menge' => 1.0,
'Textpos' => NULL,
'Bezeichnung' => NULL,
'Einzelpreis' => 100.0,
'Gesamtpreis' => NULL,
),
)
================================
Nach Sortieren:
================================
array (
0 =>
array (
'UID' => '5ea6c60947793',
'Status' => 'F',
'Prio' => 1,
'Prio2' => 2,
'Datum' => '2020-04-02',
'Menge' => 1.0,
'Textpos' => NULL,
'Bezeichnung' => NULL,
'Einzelpreis' => 100.0,
'Gesamtpreis' => NULL,
),
1 =>
array (
'UID' => '5ea6c60947793',
'Status' => 'RW',
'Prio' => 1,
'Prio2' => 1,
'Datum' => '2020-04-02',
'Menge' => 1.0,
'Textpos' => NULL,
'Bezeichnung' => NULL,
'Einzelpreis' => 0.0,
'Gesamtpreis' => NULL,
),
2 =>
array (
'UID' => '5ea6c609473ab',
'Status' => 'RW',
'Prio' => 1,
'Prio2' => 1,
'Datum' => '2020-06-02',
'Menge' => 1.0,
'Textpos' => NULL,
'Bezeichnung' => NULL,
'Einzelpreis' => 15.0,
'Gesamtpreis' => 15.0,
),
)
================================