Принятый ответ имеет вариант цикла, который не всегда будет работать.
if($a->$props[$i-1] == $b->$props[$i-1])
return $a->$props[$i] < $b->$props[$i] ? 1 : -1;
obj1 prop1: foo, prop2: bar, prop3: test
obj2 prop1: foo, prop2: bar, prop3: apple
При $ i = 1 первое сравнение верно, и, поскольку bar не меньше bar, он вернет -1, а не продолжит цикл для вычисления prop3.
Просто к вашему сведению.
У меня есть вариант, который также принимает направление, поэтому каждое свойство можно также отсортировать по возрастанию или убыванию, используя -1 и 1 соответственно.
function sortByProps(&$anArray, $props) {
usort($anArray, function($a, $b) use ($props) {
for($i = 0; $i < count($props); $i++) {
if( $a->{$props[$i][0]} < $b->{$props[$i][0]}) {
return $props[$i][1];
}
else if( $a->{$props[$i][0]} > $b->{$props[$i][0]}) {
return -1* $props[$i][1];
}
}
return 0;
});
}
sortByProps($someArray,(array(['name',-1],['address',-1],['occupation',-1],['favorite_food',-1])));