我有一个数组:
array(1,'Test','Jonathan')
并且id喜欢以:
结束array(1,'Jonathan','Test')
我如何使用PHP实现这一目标?
答案 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) ?: ...
如果你也可以使用混合输入字符串,那么你应该接受单行代码并不是一个好主意。 : - )