我有一个全字母或全数字的值数组,需要按升序对它们进行排序。 此外,我希望将全数字值移动到数组的末尾,以便它们出现在所有非数字值之后。
$test = ["def", "yz", "abc", "jkl", "123", "789", "stu"];
如果我在它上运行sort()
,我会得到:
Array
(
[0] => 123
[1] => 789
[2] => abc
[3] => def
[4] => jkl
[5] => stu
[6] => yz
)
但我想看看:
Array
(
[0] => abc
[1] => def
[2] => jkl
[3] => stu
[4] => yz
[5] => 123
[6] => 789
)
我尝试了array_reverse()
,但这似乎并没有改变任何事情。我不知道如何最后获得数字,但按升序排列。
您需要的是排序,但具有自定义比较功能(usort)。以下代码将完成它:
function myComparison($a, $b){
if(is_numeric($a) && !is_numeric($b))
return 1;
else if(!is_numeric($a) && is_numeric($b))
return -1;
else
return ($a < $b) ? -1 : 1;
}
$test = array("def", "yz", "abc", "jkl", "123", "789", "stu");
usort ( $test , 'myComparison' );
您可以在排序之前将数字转换为整数:
$array = array("def", "yz", "abc", "jkl", "123", "789", "stu");
foreach ($array as $key => $value) {
if (ctype_digit($value)) {
$array[$key] = intval($value);
}
}
sort($array);
print_r($array);
输出:
Array
(
[0] => abc
[1] => def
[2] => jkl
[3] => stu
[4] => yz
[5] => 123
[6] => 789
)
在下面的代码中,将数据分成两个数组:一个是数字,另一个不是,并对其进行排序和合并。
$arr1 = $arr2 = array();
$foreach ($arr as $val) {
if (is_numeric($val)) {array_push($arr2, $val); }
else {array_push($arr1, $val);}
}
所以你必须将数组分开
,包括数字和非数字sort($arr2);
sort($arr1);
$test = array_merge($arr2,$arr1);
您可以使用 usort 和自定义比较函数来执行此操作,但这听起来比它的价值更麻烦。 我会使用 sort
,然后相应地处理该输出。 目前尚不清楚您希望如何使用它,但一个简单的方法可能是:
sort($test);
foreach ($test as $index=>$value) {
if (is_numeric($value)) {
$test[] = $value;
unset($test[$index]);
} else {
continue;
}
}
usort
可能会更快,并且它将执行一次比较,而到目前为止提到的其他解决方案可能会慢一些,因为它们需要在排序之前或之后迭代部分或全部数组
您不需要为此任务进行任何迭代处理 - 因此不应该。
使用 array_multisort()
按数字对数组进行排序,然后按字符串排序(通常)。
代码:(演示)
array_multisort($test, SORT_NUMERIC, $test);