将一个由字母和数字字符串类型元素组成的数组按照字母顺序升序排序,但是数字元素要排在字母元素之后。

16

我有一个值的数组,其中要么是完全由字母组成的要么是完全由数字组成的,需要按升序排序。此外,我希望所有数字值都移动到数组的末尾,以便它们出现在所有非数字值之后。

$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(),但似乎没有改变任何东西。我不知道如何将数字放在最后,而且按升序排列。


你可以尝试将数组分成两部分:字符串和整数,然后进行排序,最后再合并它们。 - Apoorv Saxena
有很多好的答案,我希望能得到一个像sort()这样简单的函数,但是我想总体来说下面的答案都是有道理的。谢谢大家,我会尝试它们,并回来告诉大家哪个最适合我的需求。 - chris
5个回答

15

你需要的是使用自定义比较函数的排序(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' );

7

在排序之前,您可以将数字转换为整数:

$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
)

2
在以下代码中,将数据分为两个数组:一个是数字,另一个不是数字,并对它们进行排序和合并。
$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);

1

您可以使用usort和自定义比较函数来实现此操作,但这似乎比它值得的麻烦。我会使用sort,然后相应地处理输出。不清楚您想如何使用它,但一个简单的方法可能是:

sort($test);
foreach ($test as $index=>$value) {
    if (is_numeric($value)) {
       $test[] = $value;
       unset($test[$index]);
    } else {
        continue;
    }
}

usort 可能会更快,因为它只需要进行一次比较,而其他提到的解决方案可能会稍微慢一些,因为它们需要在排序之前或之后迭代整个数组或部分数组。


1

对于这个任务,您不需要进行任何迭代处理--因此也不应该。

使用array_multisort()对数组进行数字排序,然后按字符串排序(通常情况下)。

代码:(演示)

array_multisort($test, SORT_NUMERIC, $test);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接