Сортировка многомерного массива по размеру его подрешеток


У меня есть такой многомерный массив:

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 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-элементными подмножествами), то вам нужно будет указать это в своем вопросе.