PHP数组的自然反向排序并不保留键值

8

我希望对一个数组进行自然排序,按照相反的顺序排序并且不保留键。例如,我想要以下数组:

[0] => 1-string
[1] => 2-string
[2] => 10-string
[3] => 4-srting
[4] => 3-srting

变成这样:
[0] => 10-srting
[1] => 4-string
[2] => 3-string
[3] => 2-string
[4] => 1-string

我已经用usort($array, 'strnatcmp')接近了解决方法,但它并不是倒序的。在之后使用array_reverse()也没有帮助。
有什么想法吗?

这是自然排序还是非自然排序?我认为自然排序应该是“计数”,所以它应该是1-string,10-string,2-string,3-string,4-string,而非自然排序应该是4-string,3-string,2-string,10-string,1-string。由于我经常会误解事情(因为我已婚,24/7都有可能发生沟通问题),所以您能否给出更详细的解释,因为我不理解您的排序系统。 - ThePrimeagen
自然数是1、2、3、4、10——这个我可以做到。现在我需要按相反的顺序获取它们,即:10、4、3、2、1。 - Phil
7个回答

7
我对“array_reverse()之后没有帮助”有点困惑,因为:
<?php
echo PHP_VERSION, "\n";

$x = array( 
    '1-string',
    '2-string',
    '10-string',
    '4-srting',
    '3-srting'
);

natsort($x);
$x = array_reverse($x, false);
print_r($x);

打印

5.3.8
Array
(
    [0] => 10-string
    [1] => 4-srting
    [2] => 3-srting
    [3] => 2-string
    [4] => 1-string
)

在我的电脑上


5
使用 array_reverse()$preserveKeys 属性可以在 natcasesort() 后重置键并反转数组。
function rnatcasesort(&$array) {
    natcasesort($array);
    $array = array_reverse($array, false);
}

$values = array('1-string', '2-string', '10-string', '4-string', '3-string');

rnatcasesort($values);

var_dump($values);

/*
array(5) {
  [0]=>
  string(9) "10-string"
  [1]=>
  string(8) "4-string"
  [2]=>
  string(8) "3-string"
  [3]=>
  string(8) "2-string"
  [4]=>
  string(8) "1-string"
}
*/


3

使用带有SORT_NATURAL标志的rsort()

rsort($array, SORT_NATURAL);

SORT_NATURAL是在PHP 5.4中引入的。如果你使用的版本较低,请使用array_reverse(natsort())的方式。


0

你可以这样做

<?php
$arr  = array("1-string", "2-string", "10-string","4-srting", "3-srting");

function sort_reverse($a, $b){
  $a = (int)$a;
  $b = (int)$b;
  if ($a > $b){
    return -1;
  }
  if ($a < $b){
    return 1;
  }
   return 0;
}
usort($arr, "sort_reverse");
var_dump($arr);

在这里插入空白 http://codepad.org/6dn81S3f


0

这个有效:

$array = array('1-string', '2-string', '10-string', '4-string', '3-string');
natsort($array);
$array = array_reverse($array);
print_r($array);

0
使用此函数首先进行自然排序,然后使用array_reverse使其按降序排列。
    function natrsort($array)
    {
      natsort($array);
      return array_reverse($array);
    }
    natrsort($array); 

-1

rsort($array) 不符合您的需求吗?


不对。这让我得到4、3、2、10、1。 - Phil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接