alf*_*sin 12 php arrays sorting
考虑以下关联数组
$arr = Array
(
[banana] => 2
[cherry] => 1
[orange] => 3
[grapefruit] => 1
[apple] => 1
)
Run Code Online (Sandbox Code Playgroud)
我想以类似于PLSQL术语的方式对其进行排序:( A DESC, B ASC
其中A是值,B是键)意思是:
$arr = Array
(
[orange] => 3
[banana] => 2
[apple] => 1
[cherry] => 1
[grapefruit] => 1
)
Run Code Online (Sandbox Code Playgroud)
所以橙色和香蕉是第一个因为VALUE,但我按字母顺序排列苹果,樱桃和葡萄柚,因为它们具有相同的价值.
我试了一下:
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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
并用usort()调用它,但它也没有用.
所以我的问题是:是否有一个实现所请求行为的PHP方法?
对于Eugen:
我尝试了它,它在排序之前不起作用:
Array
(
[lamb] => 3
[rule] => 1
[children] => 1
[teacher] => 2
[eager] => 1
)
Run Code Online (Sandbox Code Playgroud)
并在排序后:
Array
(
[children] => 1
[eager] => 1
[rule] => 1
[teacher] => 2
[lamb] => 3
)
Run Code Online (Sandbox Code Playgroud)
Zbi*_*iew 13
您可以使用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
)
*/
?>
Run Code Online (Sandbox Code Playgroud)
它的工作原理如下:
(也许你会发现这个解释更容易理解)