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



我有一个以下格式的数组:

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;
    }
});
您可以使用

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 文档中关于排序数组的以下短语:

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

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

这当然会扼杀分两步排序的想法。

最新更新