考虑以下关联数组
$arr = Array
(
[banana] => 2
[cherry] => 1
[orange] => 3
[grapefruit] => 1
[apple] => 1
)
我想以类似于 PLSQL 术语的方式对其进行排序:A DESC, B ASC
(其中 A 是值,B 是键)含义:
$arr = Array
(
[orange] => 3
[banana] => 2
[apple] => 1
[cherry] => 1
[grapefruit] => 1
)
所以橙子和香蕉首先是因为价值,但后来我按字母顺序排列苹果、樱桃和葡萄柚,因为它们具有相同的价值。
我尝试过:
1. 运行 ksort(),然后运行 asort()/rsort() 希望第二种排序会将橙色和香蕉提升到数组的开头,而不会弄乱其他 3 个项目的字母排序。我错了。它确实搞砸了一切。所以我检查了:
2.排序函数和array_multisort()。但显然它一次对多个数组或多维数组进行排序。
3.我还尝试定义以下比较函数:
function cmp($a, $b)
{
foreach ($a as $key1 => $val1) {
foreach ($b as $key2 => $val2) {
if($val1 == $val2){
return strcmp($key1,$key2);
}
else if ($val1 > $val2){
return 1;
}
else{ // $val1 < $val2
return -1;
}
}
}
}
并用 usort() 调用它,但它也没有工作。
所以我的问题是:是否有实现请求行为的 PHP 方法?
对于欧根:
我试过了,但它不起作用排序前:
Array
(
[lamb] => 3
[rule] => 1
[children] => 1
[teacher] => 2
[eager] => 1
)
排序后:
Array
(
[children] => 1
[eager] => 1
[rule] => 1
[teacher] => 2
[lamb] => 3
)
array_multisort
<?php
$arr = Array
(
'banana' => 2,
'cherry' => 1,
'orange' => 3,
'grapefruit' => 1,
'apple' => 1
);
$values = array_values($arr);
$keys = array_keys($arr);
//first sort by values desc, then sort by keys asc
array_multisort($values, SORT_DESC, $keys, SORT_ASC, $arr);
print_r($arr);
// output:
/*
Array
(
[orange] => 3
[banana] => 2
[apple] => 1
[cherry] => 1
[grapefruit] => 1
)
*/
?>
它的工作原理是这样的:
- 对于用于排序的每一列(值和键),创建新的 1D 数组及其内容
- 将这些 1D 数组传递给array_multisort排序顺序中的函数(因此先$values,然后$keys),为每个数组添加排序顺序
- 最后一个参数必须是您要排序的数组
(也许你会发现这个解释更容易理解)
function polysortcmp($a, $b) {
if ($a[1]<$b[1]) return 1;
if ($a[1]>$b[1]) return -1;
if ($a[0]<$b[0]) return -1;
if ($a[0]>$b[0]) return 1;
return 0;
}
function polysort(&$arr) {
foreach ($arr as $k=>$v) $arr[$k]=array($k,$v);
uasort($arr, "polysortcmp");
foreach ($arr as $k=>$v) $arr[$k]=$v[1];
}
使用了数组排序函数arsort。
$arr = array(
'banana' => 2,
'cherry' => 1,
'orange' => 3,
'grapefruit' => 1,
'apple' => 1
);
arsort($arr);
print_r($arr);
输出
Array ( [orange] => 3 [banana] => 2 [apple] => 1 [grapefruit] => 1 [cherry] => 1 )