Я предпочел array_multisort
Руководство по PHP в моем ответе ниже, поскольку вы можете указать порядок сортировки с параметрами.
Помимо гибкости, это должно быть быстрее, чем использование usort
, из-за чего возникает проблема, заключающаяся в том, что он не параметризован для порядка сортировки, поэтому не нужно заново изобретать колесо.
Для большего удобства оберните его в функцию, определяющую клавиши как строки ( Демонстрация ):
$sorted = $multisortByKey($array, 'conversions', SORT_DESC, 'label', SORT_ASC);
как в:
$array = array(
0 => array(
'label' => 'Germany',
'conversions' => 1,
),
1 => array(
'label' => 'United States',
'conversions' => 8,
),
2 => array(
'label' => 'France',
'conversions' => 1,
),
3 => array(
'label' => 'China',
'conversions' => 1,
),
4 => array(
'label' => 'Philippines',
'conversions' => 1,
),
5 => array(
'label' => 'Turkey',
'conversions' => 1,
),
);
$multisortByKey = function(array $a) {
$args = func_get_args();
$a = array_shift($args);
$extract = function($k) use($a) {return array_map(function($v) use($k) { return $v[$k]; }, $a); };
# NOTE: The following check/for-loop is not entirely correct
# as multiple sort parameters per entry are allowed. I leave this
# for practice.
$c = count($args);
if(!$c%2) throw new InvalidArgumentException('Parameter count mismatch');
for($i=0;$i<$c;$i+=2)
$args[$i] = $extract($args[$i]);
$args[] = &$a;
call_user_func_array('array_multisort', $args);
return $a;
};
$sorted = $multisortByKey($array, 'conversions', SORT_DESC, 'label', SORT_ASC);
var_dump($sorted);