ursus contionabundo: Ich weiß, warum der letzte Sommer so heiß war...

Beitrag lesen

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.