按子数组大小对多维数组进行排序

3

我有一个多维数组:

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)。我该怎么做?


相关部分有太多重复内容。 - Mike B
4个回答

9
您可以使用 usort 函数来实现此目的。
function cmp($a, $b){
    return (count($b) - count($a));
}
usort($array, 'cmp');
$highest_3_sub_arrays = array_slice($array, 0, 3);

3
这可能是您在寻找的内容:
natsort($sub_count);
$rev = array_reverse($sub_count);
$result = array_pad($rev, 3);

如果你已经有了有序的值,那么你可能希望省略实际的排序过程。


1
$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

谢谢,它也能运行。只需将echo重命名为:print_r(array_pop($sizes)); //输出3print_r(array_pop($sizes)); //输出2print_r(array_pop($sizes)); //输出2 - peter

0

在我看来,所有其他答案都过于复杂。不需要使用usort()count()foreach(),当我尝试使用natsort()时,它给了我一个错误提示:<b>注意</b>:<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元子数组之间),那么您需要在问题中指明。


@peter 我正在重新审视我的旧答案,看看是否能够改进它们。据我所知,没有比我发布的更好的方法了。你是否考虑过我的答案作为解决方案? - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接