- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这个问题实际上是受 SO 上的另一个问题启发的,我想稍微扩展一下。
在 PHP 中有一个关联数组是否可以对其值进行排序,但在值相等的情况下,可以使用 PHP 的一个(或多个)内置排序函数来保留原始键顺序?
这是我用来测试可能解决方案的脚本(还没有找到):
<?php
header('Content-type: text/plain');
for($i=0;$i<10;$i++){
$arr['key-'.$i] = rand(1,5)*10;
}
uasort($arr, function($a, $b){
// sort condition may go here //
// Tried: return ($a == $b)?1:($a - $b); //
// Tried: return $a >= $b; //
});
print_r($arr);
?>
陷阱:因为键是在原始数组中排序的,所以请不要试图建议任何按键排序以恢复到原始顺序。我用它们制作了示例,以便更容易在输出中直观地检查它们的顺序。
最佳答案
自PHP does not support stable sort after PHP 4.1.0 ,您需要编写自己的函数。
这似乎可以满足您的要求:http://www.php.net/manual/en/function.usort.php#38827
As the manual says, "If two members compare as equal, their order in the sorted array is undefined." This means that the sort used is not "stable" and may change the order of elements that compare equal.
Sometimes you really do need a stable sort. For example, if you sort a list by one field, then sort it again by another field, but don't want to lose the ordering from the previous field. In that case it is better to use usort with a comparison function that takes both fields into account, but if you can't do that then use the function below. It is a merge sort, which is guaranteed O(n*log(n)) complexity, which means it stays reasonably fast even when you use larger lists (unlike bubblesort and insertion sort, which are O(n^2)).
<?php
function mergesort(&$array, $cmp_function = 'strcmp') {
// Arrays of size < 2 require no action.
if (count($array) < 2) return;
// Split the array in half
$halfway = count($array) / 2;
$array1 = array_slice($array, 0, $halfway);
$array2 = array_slice($array, $halfway);
// Recurse to sort the two halves
mergesort($array1, $cmp_function);
mergesort($array2, $cmp_function);
// If all of $array1 is <= all of $array2, just append them.
if (call_user_func($cmp_function, end($array1), $array2[0]) < 1) {
$array = array_merge($array1, $array2);
return;
}
// Merge the two sorted arrays into a single sorted array
$array = array();
$ptr1 = $ptr2 = 0;
while ($ptr1 < count($array1) && $ptr2 < count($array2)) {
if (call_user_func($cmp_function, $array1[$ptr1], $array2[$ptr2]) < 1) {
$array[] = $array1[$ptr1++];
}
else {
$array[] = $array2[$ptr2++];
}
}
// Merge the remainder
while ($ptr1 < count($array1)) $array[] = $array1[$ptr1++];
while ($ptr2 < count($array2)) $array[] = $array2[$ptr2++];
return;
}
?>
此外,您可能会发现 this forum thread有趣。
关于php - 使用 PHP 的 uasort 进行排序时保留键顺序(稳定排序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4353739/
如何重写这个uasort函数 (宇宙飞船运算符(operator))? uasort($hits, function($a, $b) { if($a['total'] == $b['tota
我有一个基本上是数组包装器并实现 IteratorAggregate 的类。当创建该类的新对象时,它将其值存储在一个名为 $value 的 protected 变量中。该值可以是字符串、整数等。或可遍
不幸的是,我在使用 uasort 时遇到问题(或任何需要回调函数的函数)在命名空间中。 在这个脚本中,我没有使用任何类(因此没有 OOP)。 我没有想出任何解决方案(用回调函数声明命名空间没有帮助)。
class DBNews { public function get_latest_posts($limit){ // code goes here $post
如果一个对象中有 2 列 A -> 值为 10 8 6 4 B -> 值为 9 7 5 3 我想将 B 合并到 A 中,其中 9 低于 10,7 低于 8 等等。 uasort($TopConsume
我正在尝试为我的多维数组创建排序函数,但我无法弄清楚算法。 下面是我要排序的数组的例子 [test1] => Array ( [soldAvg] => 3 [i
我需要按值对数组进行排序,但如果元素的值相等,我需要比较它们的键并按它们排序。 uasort($pages_arr, function($a, $b){ if ($a
目前我有一些看起来像这样的多维数组 Array ( [71] => Array ( [author] => 2 [date] => 1392867376 ) [49] => Array
我正在使用 uasort 对如下所示的数组进行排序: Array ( [2] => 0 [3] => 0 [4] => 0 ) 我正在尝试按值排序,维护键关联。此外,如果值相同,我需要保留
数字索引数组: bool usort( array &$array, callback $cmp_function ) usort函数对指定数组(参数1)按指定方式(
我想在 compare_by_flags 函数中使用这个 $sort_flags 数组,但我没有找到方法,这可能吗? public function sort_by_rank(array $sort_
如果在 PHP 中有一个相当基本的 uasort 函数,如下所示: uasort($arr, function($a, $b) { if ($a > $b)
这个问题实际上是受 SO 上的另一个问题启发的,我想稍微扩展一下。 在 PHP 中有一个关联数组是否可以对其值进行排序,但在值相等的情况下,可以使用 PHP 的一个(或多个)内置排序函数来保留原始键顺
将 php 版本从 5.5 更改为 7.0 后,我遇到了 Magento 1.8 的奇怪行为。这种奇怪的行为是由于功函数 uasort 发生了变化。 源代码: [ "before"
我是一名优秀的程序员,十分优秀!