基于count()对关联数组进行排序,并按字母顺序对具有相同count()的数组进行排序

时间:2016-02-22 21:01:04

标签: php arrays sorting

我有以下格式

的数组
array("Vancouver FIR"=>array("data:data:data:data", "more:data", "even:more:data"), "Toronto FIR"=>array("data", "more:data"));

这个阵列实际上要大得多,每三分钟就会改变一次。

我需要通过关联数组键的count()对此数组进行排序。此外,如果count()相同,则需要按字母顺序排序。

我尝试过使用usort / uksort但没有成功?这主要是因为一个为您提供值,一个为您提供密钥,但在这种情况下,我需要两个。我正在研究制作自己的排序算法,但不知道从哪里开始。有什么建议??提前致谢

我尝试过:

usort($sorted, function($x, $y) {
    if (count($x) == count($y)) {
        return strcmp(key($x),key($y));
    } else {
        return $x > $y ? -1 : 1;
    }
});

1 个答案:

答案 0 :(得分:3)

您可以使用array_multisort

// input data
$data = array(
    "Vancouver FIR"=>array("data:data", "more:data", "even:more:data"), 
    "Toronto FIR"=>array("data", "more:data"),
    "Montreal FIR"=>array("data", "more:data", "lalala"),
);

// get the counts from the original array
$counts = array_map(function($v) { return count($v); }, $data);
// get the keys from the original array
$keys = array_keys($data);

// sort first by counts, then by keys, and 
// let the original data array follow the same re-ordering.
array_multisort($counts, SORT_ASC, $keys, SORT_ASC, $data);

如果您需要将这些维度中的一个或两个降序排序,请在需要时将SORT_ASC替换为SORT_DESC

备注

对原始数组进行两次排序可能很诱人,首先是在键上,然后是在计数上,但由于PHP documentation on sorting arrays中的以下短语,这不能保证正常工作:

  

如果这些排序函数中的任何一个将两个成员评估为相等,则订单未定义(排序不稳定)。

实际上这意味着PHP数组排序方法不能保证如果两个项具有相等的排序值,它们将保持它们在排序开始之前的相对位置。他们可以互换。

这当然会导致分两步排序的想法。