PHP Сортировка многомерного массива по количеству элементов
У меня есть массив, например:
Array
(
[DEF] => Array
(
[0] => Array
(
[type] => 1
[id] => 1212
[name] => Jane Doe
[current] => 1
)
[1] => Array
(
[type] => 1
[id] => 3123121
[name] => Door
[current] =>
)
)
[ABC] => Array
(
[0] => Array
(
[type] => 1
[id] => 1234
[name] => John Doe
[current] =>
)
)
[WW] => Array
(
[0] => Array
(
[type] => 1
[id] => 1212
[name] => Jane Doe
[current] => 1
)
[1] => Array
(
[type] => 1
[id] => 3123121
[name] => Door
[current] =>
)
[2] => Array
(
[type] => 1
[id] => 64646
[name] => Floor
[current] =>
)
)
)
И я хочу отсортировать этот массив по числу (count()) элементов внутреннего массива, спускающихся (то есть большинство элементов сначала), поэтому у меня будет этот массив:
Array
(
[WW] => Array
(
[0] => Array
(
[type] => 1
[id] => 1212
[name] => Jane Doe
[current] => 1
)
[1] => Array
(
[type] => 1
[id] => 3123121
[name] => Door
[current] =>
)
[2] => Array
(
[type] => 1
[id] => 64646
[name] => Floor
[current] =>
)
)
[DEF] => Array
(
[0] => Array
(
[type] => 1
[id] => 1212
[name] => Jane Doe
[current] => 1
)
[1] => Array
(
[type] => 1
[id] => 3123121
[name] => Door
[current] =>
)
)
[ABC] => Array
(
[0] => Array
(
[type] => 1
[id] => 1234
[name] => John Doe
[current] =>
)
)
)
Может ли кто-нибудь предложить эффективный способ сделать это? Спасибо.
Ответы
Ответ 1
Использование uksort
:
uksort($array, function($a, $b) { return count($b) - count($a); });
Использование array_multisort
:
array_multisort(array_map('count', $array), SORT_DESC, $array);
С PHP < 5.3:
function sort_cb($a, $b) {
return count($b) - count($a);
}
uksort($array, 'sort_cb');
Ответ 2
<?php
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return (count($a) > count($b)) ? -1 : 1;
}
$a = array(
"AA" => array(
array('type'=>'1', 'id'=>'2'),
array('type'=>'2', 'id'=>'2')),
'BB' => array(
array('type'=>'1', 'id'=>'2'),
array('type'=>'2', 'id'=>'2'),
array('type'=>'5', 'id'=>'2')),
'CC' => array(
array('type'=>'1', 'id'=>'2'))
);
usort($a, "cmp");
print_r($a);
?>
Ответ 3
$tempArr = $sortedArr = array();
foreach ($myArr as $k => $v) $tempArr[$k] = count($v);
asort($tempArr);
foreach ($tempArr as $k => $v) $sortedArr = $myArr[$k];
Обратите внимание, что это сломается, если какое-либо из значений массива не является самим массивом, вы можете захотеть добавить проверку is_array()
где-нибудь...