Сортировать многомерный массив по размеру его подмассивов. - PullRequest
2 голосов
/ 26 февраля 2012

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

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 ]

7 голосов
/ 26 февраля 2012

Вы можете достичь этого, используя функцию usort .

function cmp($a, $b){
    return (count($b) - count($a));
}
usort($array, 'cmp');
$highest_3_sub_arrays = array_slice($array, 0, 3);
3 голосов
/ 26 февраля 2012

Это может быть то, что вы ищете:

natsort($sub_count);
$rev = array_reverse($sub_count);
$result = array_pad($rev, 3);

Возможно, вы захотите пропустить фактическую сортировку, если ваши значения уже в порядке.

1 голос
/ 26 февраля 2012
$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
0 голосов
/ 18 апреля 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...