我有一个数组:
array(1,'Test','Jonathan')
并且 id 喜欢最终得到:
array(1,'Jonathan','Test')
我如何使用 PHP 完成此任务?
使用usort()
:
http://php.net/manual/en/function.usort.php
在您的回调中,分别处理案例:当两者都是数字时,当两者都是字符串时,以及当一个是数字而另一个是字符串时。像你一样小心类型转换。
一种可能的方法(演示):
$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
)
正如每个人都同意的那样,无论这里有什么解决方案,它都与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) ?: ...
如果您还可以使用混合输入字符串,那么您可能应该接受单行不是一个好主意。:-)