我需要在php中对一个数组进行排序based on value,array使用一些数字作为键和值,例如:
$a = array(70 => 1 ,82 => 5 ,61 => 3 ,55 => 1 ,34 => 2 ,53 => 2 ,21 => 4 ,13 => 5);
"我喜欢这样排序“
Array
(
[82] => 5
[13] => 5
[21] => 4
[61] => 3
[34] => 2
[53] => 2
[70] => 1
[55] => 1
)
我使用了arsort
,它工作正常,但有一个问题,因为此函数使更改defult sortedkeys和sort数组为:
Array
(
[13] => 5
[82] => 5
[21] => 4
[61] => 3
[53] => 2
[34] => 2
[55] => 1
[70] => 1
)
7条答案
按热度按时间jvidinwx1#
构造一个新数组,其元素为原始数组的键、值和位置:
然后使用用户定义的顺序(考虑原始位置)进行排序:
最后,将其转换回原始关联数组:
huus2vyu2#
作为参考,我在Github上放置了一组内置PHP函数的稳定排序变体:https://github.com/vanderlee/PHP-stable-sort-functions,基于@Barmar的解决方案和一些其他技巧。
7dl7o3gd3#
这是因为
sort
系列的函数是不稳定的,如果你需要排序是稳定的,那么你要么自己实现它,要么迭代排序结果并使用array_splice
“校正”元素的位置。sf6xfgos4#
array_multisort
的简单解决方案。kknvjkwl5#
这是一个很大的变通办法,但它确实有效:
vardump输出:
5rgfhyps6#
PHP使用快速排序作为基本的排序算法。你有两个选择:
1.编制自己稳定排序机制
我在github上编写了一个Perl特/avalanchesort(https://github.com/porthd/avalanchesort)包,它包含了一个递归的naturell-merge-sort。你可以使用你自己的比较函数和数据结构。这个包包含了一个关联数组和列表数组的例子。
qyswt5oh7#
您可以创建自己的排序函数,以满足自定义排序条件,然后使用usort(),使用创建的函数遍历整个数组,以对数组进行排序。