我有以下格式:
的数组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;
}
});
答案 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数组排序方法不能保证如果两个项具有相等的排序值,它们将保持它们在排序开始之前的相对位置。他们可以互换。
这当然会导致分两步排序的想法。