0

我有一个数组:

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

并且 id 喜欢最终得到:

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

我如何使用 PHP 完成此任务?

4

3 回答 3

2

使用usort()

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

在您的回调中,分别处理案例:当两者都是数字时,当两者都是字符串时,以及当一个是数字而另一个是字符串时。像你一样小心类型转换。

于 2013-05-18T18:25:32.863 回答
2

一种可能的方法(演示):

$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
)
于 2013-05-18T18:29:57.337 回答
0

正如每个人都同意的那样,无论这里有什么解决方案,它都与usort.

如果您想要的排序顺序是先按升序排列的数字,然后按升序排列的字典顺序,那么一个几乎可以确定的比较是

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

看到它在行动

这样做的问题是,如果输入包含混合输入字符串,例如“User10”和“User2”,它将不会按字典顺序对它们进行排序(“User2”将排在第一位)。

如果您可能在数组中有浮点数和整数(但不是混合输入字符串),那么您可以增加上面的内容以读取

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

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

于 2013-05-18T18:33:49.873 回答