代码之家  ›  专栏  ›  技术社区  ›  chris

对字母和数字字符串类型元素的数组ASC进行排序,但在字母元素之后使用数字元素

  •  16
  • chris  · 技术社区  · 13 年前

    我有一个值数组,这些值要么都是字母,要么都是数字,需要以升序对它们进行排序。此外,我希望将所有数值移动到数组的末尾,以便它们出现在所有非数值之后。

    $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() ,但这似乎并没有改变什么。我不知道如何把数字排在最后,但要按升序排列。

    5 回复  |  直到 3 年前
        1
  •  15
  •   DiverseAndRemote.com    13 年前

    您需要的是排序,但要使用自定义比较函数(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' );
    
        2
  •  7
  •   Tchoupi    13 年前

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

    $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
    )
    
        3
  •  2
  •   faq    13 年前

    在下面的代码中,将数据分为两个数组:一个是数字数组,另一个不是数字数组,并对其进行排序和合并。

    $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);
    
        4
  •  1
  •   ernie    13 年前

    你可以使用 usort 和自定义比较功能,但这听起来麻烦多了。我会用 sort ,然后相应地处理该输出。目前尚不清楚您想如何使用它,但一个简单的方法可能是:

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

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

        5
  •  1
  •   mickmackusa Tom Green    3 年前

    您不需要为此任务进行任何迭代处理,因此不应该这样做。

    使用 array_multisort() 对数组进行数字排序,然后作为字符串(通常)。

    代码:( Demo )

    array_multisort($test, SORT_NUMERIC, $test);