Сортировка многомерного массива по размеру его подрешеток
У меня есть такой многомерный массив:
Array
(
[0] => Array
(
[0] => 2012-02-26 07:15:00
)
[1] => Array
(
[0] => 2012-02-26 17:45:00
[1] => 2012-02-26 18:55:00
)
[2] => Array
(
[0] => 2012-02-26 18:55:00
[1] => 2012-02-26 17:45:00
)
[3] => Array
(
[0] => 2012-02-26 18:57:00
[1] => 2012-02-26 17:45:00
[2] => 2012-02-26 18:55:00
)
Когда я считаю подмножества, я получаю это 1,2,2,3. Как я мог получить его в 3,2,2,1? Мне нужно, например, получить последние 3 подмассива с наибольшим количеством подмассивов (DESC, это означает 3,2,2). Как я могу этого достичь?
4 ответа:
Вы можете достичь этого, используя функцию usort.
function cmp($a, $b){ return (count($b) - count($a)); } usort($array, 'cmp'); $highest_3_sub_arrays = array_slice($array, 0, 3);
Это может быть то, что вы ищете:
natsort($sub_count); $rev = array_reverse($sub_count); $result = array_pad($rev, 3);
Вы можете опустить фактическую сортировку, если значения у вас уже есть в порядке.
$sizes=array(); foreach ($myarray as $k=>$v) if (!is_array($v)) $sizes["$k"]=0; else $sizes["$k"]=sizeof($v); sort($sizes); echo array_pop($sizes); //outputs 3 echo array_pop($sizes); //outputs 2 echo array_pop($sizes); //outputs 2
Мне кажется, что все остальные ответы работают слишком усердно.
usort()
,count()
, иforeach()
не нужны, и когда я попробовалnatsort()
, он дал мне:<b>Notice</b>: Array to string conversion in <b>[...][...]</b>
.Rsort () поставит на первое место Самые длинные подмножества.
Код:
$array=array( ["2012-02-26 18:55:00","2012-02-26 17:45:00"], ["2012-02-26 07:15:00"], ["2012-02-26 18:57:00","2012-02-26 17:45:00","2012-02-26 18:55:00"], ["2012-02-26 17:45:00","2012-02-26 18:55:00"] ); $size=3; // modify this line to declare how many subarrays to capture rsort($array); // sort the subarrays in DESC order var_export(array_slice($array,0,$size)); // print the first n subarrays
Вывод:
array ( 0 => array ( 0 => '2012-02-26 18:57:00', 1 => '2012-02-26 17:45:00', 2 => '2012-02-26 18:55:00', ), 1 => array ( 0 => '2012-02-26 18:55:00', 1 => '2012-02-26 17:45:00', ), 2 => array ( 0 => '2012-02-26 17:45:00', 1 => '2012-02-26 18:55:00', ), )
Если вы хотите реализовать дополнительную сортировку для разрыва связей длины (например, между двумя 2-элементными подмножествами), то вам нужно будет указать это в своем вопросе.