【问题标题】:I want to sort an array in reverse order of values in php我想在php中以相反的顺序对数组进行排序
【发布时间】:2010-12-04 12:47:44
【问题描述】:

我想按值的相反顺序对数组进行排序。我使用了arsort php函数,但结果对我不利。

例子:

我要排序下一个数组:

myArray = array("d" => 1, "f" => 2, "b" => 3, "c" => 4,  "e" => 2); 

使用arsort php函数后的结果是:

myArray =array ( "c" => 4, "b" => 3, "e" => 2, "f" => 2, "d" => 1 );

这不好,因为 arsort 函数不保持数组中元素的初始顺序。

我想要这样的结果:

myArray =array ( "c" => 4, "b" => 3, "f" => 2, "e" => 2, "d" => 1 );

f 在 e 顺序之前,例如来自原始数组。具有相同值的键不反转。 谢谢。

【问题讨论】:

  • 相当不寻常的任务,我无法想象这样做的合理理由。但是,您始终可以使用 usort() 来实现任何排序的排序算法
  • @Sharpnel。 usort 的主要问题是您丢失了最终产品中的密钥。在定义自己的排序功能时,您必须使用 uasort 来保留键。查看官方文档
  • @Col。又是你? :) 我希望看到您使用uasort 编写的解决方案。请赐教。

标签: php arrays


【解决方案1】:

编辑: 这不适用于内置函数,您需要实现自己的排序解决方案。可以关注这个question I opened了解更多。


这些解决方案奏效是巧合:

$myArray = array("d" => 1, "f" => 2, "b" => 3, "c" => 4,  "e" => 2);
uasort($myArray, function($a, $b){
    if($a == $b)
        return 1;
    else
        return $b - $a;
});
print_r($myArray);

$myArray = array("d" => 1, "f" => 2, "b" => 3, "c" => 4,  "e" => 2);
uasort($myArray, function($a, $b){
    return $a <= $b;
});
print_r($myArray);

【讨论】:

    【解决方案2】:

    这对我有用。

    由于 asort 和 arsort 函数似乎通过降序键值对具有相等值的行进行排序,因此如果值相等,arsort 会将较低的键值“切换”为较高的键值。

    我的解决方案是从低到高排序(asort),它仍然会进行不需要的行翻转,然后反转数组,将具有相同值的行移回各自正确的位置。

    原始:数组([0] => 1 [1] => 0.5 [2] => 2 [3] => 3 [4] => 0.5)

    sorted: Array ( [4] => 0.5 [1] => 0.5 [0] => 1 [2] => 2 [3] => 3 ) - 注意键值被翻转为相同的值行

    reversed: Array ( [3] => 3 [2] => 2 [0] => 1 [1] => 0.5 [4] => 0.5 ) - 现在您已经对数组进行了反向排序并保持了键的完整性对于具有相同值的行。

    $array=array(1,.5,2,3,.5);
    asort($array);
    $array=array_reverse($array,TRUE);
    

    【讨论】:

      【解决方案3】:

      请试试这个

      arsort($array, krsort($array));
      

      【讨论】:

      • arsort() 的第二个参数必须是二进制标志,而不是布尔值(无论类型转换如何)。这样做krsort() 有什么意义?
      • 这绝对不会做OP想要的;这将首先对键进行排序,并且 OP 希望避免对值相等的键进行排序。
      【解决方案4】:

      我认为您最好的选择是使用 uasort php 函数。 在您的情况下使用 uasort 的优势在于您可以更改定义自己的排序算法,而不是与 php asort 比较方法绑定。

      您必须定义一个回调函数来评估第一个值是否小于、大于或等于第二个值。

      您必须查看 php 官方在线文档以了解此功能的作用,但我认为很容易掌握,所以我将留下我自己的解决方案来解决您的问题。

      function cmp($a, $b) {
          if ($a == $b) {
              return 0;
          }
          return ($a < $b) ? 1 : -1;
      }
      

      使用此回调函数,您可以在键值相同时进行反向排序,同时保持键的原始顺序。

      最好, 德米安

      【讨论】:

        【解决方案5】:

        一种简单、适用于任何地方的方法是:

        <?php $a = array_flip($a); ksort($a); $a = array_flip($a); ?>
        
        1. Array_flip 翻转每个键 值。
        2. 按“now-keys”对数组进行排序;
        3. Array_flip 再次得到前一个星座和一个按值排序的数组。

        -- 附注:-- 为什么要这么复杂? @其他人。

        【讨论】:

          【解决方案6】:

          下一个数组好像没有响应是正确的:

          $myArray = array( 
              "d" => 1, "Mircea Anca" => 2, 
              "b" => 3, "Iuliana Moise" => 2, 
              "c" => 4, "Florina Popescu" => 2 )
          

          【讨论】:

          • 看我的回答。了解为什么这种类型的响应不起作用。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 1970-01-01
          • 1970-01-01
          • 2023-04-09
          相关资源
          最近更新 更多