patsch - meine Stirn ist jetzt etwas flacher.
Meine auch. Das 1 == ( $a <=> $b )
bringt bei usort natürlich nichts. Aber statt array_reverse() nachträglich anzuwenden kann man die Paare tauschen - und vor allem auf einen billigeren Vergleich zurückgreifen. Auch wenn das erst bei ein paar tausend Items fühlbar wird: Wir wollen ja nicht das Rechenzentrum heizen um es dann wieder aufwendig zu kühlen. (Ich weiß, warum der letzte Sommer so heiß war...)
<?php
$arO = [ 'foo', 'qix', 'Bar', 'Qix', 'bar', 'Foo' ];
$arC = $arO;
usort( $arC, function( $a, $b ) {
return $a <=> $b;
} );
echo '-------------------------------' . PHP_EOL;
echo 'Normaler Vergleich:' . PHP_EOL;
echo ' $a <=> $b' . PHP_EOL;
echo '-------------------------------' . PHP_EOL;
echo implode( ', ', $arC ) . PHP_EOL . PHP_EOL;
$arC = $arO;
usort( $arC, function( $a, $b ) {
return 1 == ( $a <=> $b );
} );
echo '-------------------------------' . PHP_EOL;
echo 'Ausschluss von -1 als Return:' . PHP_EOL;
echo '1 == ( $a <=> $b )' . PHP_EOL;
echo '-------------------------------' . PHP_EOL;
echo implode( ', ', $arC ) . PHP_EOL . PHP_EOL;
$arC = $arO;
usort( $arC, function( $a, $b ) {
return $b <=> $a;
} );
echo '-------------------------------' . PHP_EOL;
echo 'Spaceship mit Reverse-Params:' . PHP_EOL;
echo ' $b <=> $a' . PHP_EOL;
echo '-------------------------------' . PHP_EOL;
echo implode( ', ', $arC ) . PHP_EOL . PHP_EOL;
$arC = $arO;
usort( $arC, function( $a, $b ) {
return -1 * ( $a <=> $b );
} );
echo '-------------------------------' . PHP_EOL;
echo 'Multiplikation mit -1:' . PHP_EOL;
echo ' -1 * ( $a <=> $b )' . PHP_EOL;
echo '-------------------------------' . PHP_EOL;
echo implode( ', ', $arC ) . PHP_EOL . PHP_EOL;
$arC = $arO;
usort( $arC, function( $a, $b ) {
return (int)( $a > $b );
} );
echo '-------------------------------' . PHP_EOL;
echo 'Einfacher Vergleich' . PHP_EOL;
echo ' (int)$a > $b' . PHP_EOL;
echo '-------------------------------' . PHP_EOL;
echo implode( ', ', $arC ) . PHP_EOL . PHP_EOL;
$arC = $arO;
usort( $arC, function( $a, $b ) {
return (int)( $a < $b );
} );
echo '-------------------------------' . PHP_EOL;
echo 'Einfacher Vergleich, reverse' . PHP_EOL;
echo ' (int)$a < $b' . PHP_EOL;
echo '-------------------------------' . PHP_EOL;
echo implode( ', ', $arC ) . PHP_EOL . PHP_EOL;
Ausgaben:
-------------------------------
Normaler Vergleich:
$a <=> $b
-------------------------------
Bar, Foo, Qix, bar, foo, qix
-------------------------------
Ausschluss von -1 als Return:
1 == ( $a <=> $b )
-------------------------------
Bar, Foo, Qix, bar, foo, qix
-------------------------------
Spaceship mit Reverse-Params:
$b <=> $a
-------------------------------
qix, foo, bar, Qix, Foo, Bar
-------------------------------
Multiplikation mit -1:
-1 * ( $a <=> $b )
-------------------------------
qix, foo, bar, Qix, Foo, Bar
-------------------------------
Einfacher Vergleich
(int)$a > $b
-------------------------------
Bar, Foo, Qix, bar, foo, qix
-------------------------------
Einfacher Vergleich, reverse
(int)$a < $b
-------------------------------
qix, foo, bar, Qix, Foo, Bar
Am billigsten ist also die letzte Methode.