我有一个以下格式的数组:
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 数组排序方法不能保证如果两个项目具有相等的排序值,它们将保持排序开始前的相对位置。它们可以交换。
这当然会扼杀分两步排序的想法。