I'll answer this in a way that can be generalized, no matter how many items you wish to sort on!
Sorting on return_fare
then one_way_fare
:
usort($data, function($a, $b) {
if ($a['return_fare'] != $b['return_fare']) {
return $a['return_fare'] <=> $b['return_fare'];
}
return $a['one_way_fare'] <=> $b['one_way_fare'];
});
Sorting on return_fare
, then one_way_fare
, then destination
:
usort($data, function($a, $b) {
if ($a['return_fare'] != $b['return_fare']) {
return $a['return_fare'] <=> $b['return_fare'];
}
if ($a['one_way_fare'] != $b['one_way_fare']) {
return $a['one_way_fare'] <=> $b['one_way_fare'];
}
return strnatcasecmp($a['destination'], $b['destination']);
});
Sorting on just return_fare
:
usort($data, function($a, $b) {
return $a['return_fare'] <=> $b['return_fare'];
});
Note: you don't have to use an anonymous function with usort
!
function cmp($a, $b) {
return $a['return_fare'] <=> $b['return_fare'];
}
usort($data, 'cmp');
// Use a function inside a class:
class MyClass {
public static function compare($a, $b) {
return $a['return_fare'] <=> $b['return_fare'];
}
}
usort($data, ['MyClass', 'compare']);
You can also chain these using the Elvis Operator (?:
):
usort($data, function($a, $b) {
return $a['return_fare'] <=> $b['return_fare'] ?:
$a['one_way_fare'] <=> $b['one_way_fare'] ?:
strnatcasecmp($a['destination'], $b['destination']);
});
This last example used the Spaceship Operator (<=>
) and the Elvis Operator (?:
). Isn't programming great?