我有一个数组:
$arr = array(
'Alcatel' => '0',
'Apple' => '4542',
'LG' => '0',
'Nokia' => '0',
'Samsung' => '2760',
'Siemens' => '0',
'Sony' => '0',
);
所有键都按字母顺序排列,但值不是。 我想要: 1-保持联想 2-按值HIGH到LOW排序数组 3-维护零值条目的字母顺序
得到:
$arr = array(
'Apple' => '4542',
'Samsung' => '2760',
'Alcatel' => '0',
'LG' => '0',
'Nokia' => '0',
'Siemens' => '0',
'Sony' => '0',
);
现在当我使用arsort($ arr);
我得到了:
$arr = array(
'Apple' => '4542',
'Samsung' => '2760',
'Siemens' => '0',
'Sony' => '0',
'Nokia' => '0',
'LG' => '0',
'Alcatel' => '0',
);
所以我得到了目标1和2而不是3
有什么建议吗?
感谢。
答案 0 :(得分:0)
好的,我终于做到了:
因为$ arr是2个数组,$ titles和$ values的组合:
array_multisort($values, SORT_DESC, $titles, SORT_ASC, $arr);
这终于有效了!
答案 1 :(得分:0)
对于更一般的情况,如果您没有在单独的源数组中使用的键和值,则需要自定义比较函数。有sort
个版本将键传递给比较函数,以及传递值的版本,但是你需要两个版本,并且没有一个版本传递这两个版本。
由于uksort
传递了密钥,您可以查找值,但是如果访问从比较函数中排序的数组,则会得到不可靠的结果和来自PHP的警告。所以你需要复制一份。
我能想到的最干净的解决方案是将副本/访问包装在一个闭包中(所以这需要5.4):
$arr = array(
'Alcatel' => '0',
'Apple' => '4542',
'LG' => '0',
'Nokia' => '0',
'Samsung' => '2760',
'Siemens' => '0',
'Sony' => '0',
);
function mkcmp($arr) {
return function($k1, $k2) use ($arr) {
$v1 = $arr[$k1];
$v2 = $arr[$k2];
if ($v1 > $v2) {
return -1;
} else if ($v1 < $v2) {
return 1;
} else if ($k1 < $k2) {
return -1;
} else if ($k1 == $k2) {
return 0;
} else {
return 1;
}
};
}
uksort($arr, mkcmp($arr));
以下是排序后print_r($arr)
的输出:
Array
(
[Apple] => 4542
[Samsung] => 2760
[Alcatel] => 0
[LG] => 0
[Nokia] => 0
[Siemens] => 0
[Sony] => 0
)