按数字键排序数组先按字符串递增

时间:2013-05-18 18:23:12

标签: php sorting

我有一个数组:

array(1,'Test','Jonathan')

并且id喜欢以:

结束
array(1,'Jonathan','Test')

我如何使用PHP实现这一目标?

3 个答案:

答案 0 :(得分:2)

使用usort()

http://php.net/manual/en/function.usort.php

回调中的

,分别处理案例:当两者都是数字时,两者都是字符串,当一个是数字而另一个是字符串时。像你一样警惕类型转换。

答案 1 :(得分:2)

一种可能的方法(demo):

$arr = array(10,'Foo', 'Abc', 5, 3.2, 'Test','Jonathan');
usort($arr, function($a, $b) {
  if (is_int($a) || is_float($a)) {
    if (is_int($b) || is_float($b)) {
      return $a - $b; 
    }
    else 
      return -1;
  }
  elseif (is_int($b) || is_float($b)) {
    return 1;
  }
  else {
    return strcmp($a, $b);
  }
});
print_r($arr);

输出:

Array
(
    [0] => 3.2
    [1] => 5
    [2] => 10
    [3] => Abc
    [4] => Foo
    [5] => Jonathan
    [6] => Test
)

答案 2 :(得分:0)

每个人都同意,无论解决方案是什么,都与usort有关。

如果你想要的排序顺序是按升序排列的数字,那么按升序词典顺序排列字符串,几乎指出它的一个比较是

function($a, $b) { return is_int($b) - is_int($a) ?: strnatcmp($a, $b); }

<强> See it in action

问题在于,如果输入包含混合输入字符串,例如“User10”和“User2”,则不会按字典顺序对它们进行排序(“User2”将首先出现)。

如果你可能在数组中同时包含浮点数和整数(但不是混合输入字符串),那么你可以增加上面的内容来阅读

return is_int($b) + is_float($b) - is_int($a) - is_float(a) ?: ...

如果你也可以使用混合输入字符串,那么你应该接受单行代码并不是一个好主意。 : - )