15

我有一个数组..

$test = array("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了,但这似乎并没有改变任何东西。所以我现在有点迷失了如何获得最后的数字,但也有秩序

4

4 回答 4

14

您需要的是排序,但具有自定义比较功能(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' );
于 2012-09-25T19:55:14.040 回答
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
)
于 2012-09-25T19:53:05.003 回答
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);
于 2012-09-25T19:54:47.847 回答
1

您可以使用usort和自定义比较函数来做到这一点,但这听起来比它的价值更麻烦。我会使用sort, 然后相应地处理该输出。目前尚不清楚您想如何使用它,但一种简单的方法可能是:

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

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

于 2012-09-25T19:59:09.453 回答