1

我有一个值数组,我想按字母顺序排序,数字在字符之后排序。

例如,给定以下字符串:

Core 2 Duo, Core Duo, Core Quad, Core 4 Quad

我希望它最终这样订购:

Core Duo, Core 2 Duo, Core Quad, Core 4 Quad

相反,PHP 的 sort() 函数将其排序如下:

Core 2 Duo, Core 4 Quad, Core Duo, Core Quad

自然排序返回与常规排序相同的结果。

那么有什么方法可以告诉 PHP 类似“如果遇到一个数字,将其排序为在 Z 之后”?

4

2 回答 2

3

您所追求的似乎是将字符串的所有数字元素推到后面的函数,例如“Core 2 Duo”=>“Core Duo 2”。

// moves numeric parts of the string to the back
function transform($s)
{
        $parts = explode(' ', $s);
        foreach (array_filter($parts, 'is_numeric') as $key => $value) {
                unset($parts[$key]);
                $parts[] = $value;
        }
        return join(' ', $parts);
}

// natural sort on transformed strings
function cmp($a, $b)
{
    return strnatcmp(transform($a), transform($b));
}

$a = array('Core 2 Duo', 'Core Duo', 'Core Quad', 'Core 2 Quad');

usort($a, 'cmp');

print_r($a);
于 2013-10-02T05:10:17.383 回答
1

这是您的解决方案:

<?php

$array = array('Core 2 Duo', 'Core Duo', 'Core Quad', 'Core 4 Quad');

$tempArray = array();
foreach($array as $key=>$value) {
    $exp = explode(" ",$value); 
    if(count($exp)==3) {
        $tempArray[$key] = $exp[0]." ".$exp[2]." ".$exp[1];
    } else {
        $tempArray[$key] = $exp[0]." ".$exp[1]." "."-1";
    }
}

asort($tempArray);

$sortedArray = array();
foreach($tempArray as $key=>$value) {
    $sortedArray[] = $array[$key];
}

print_r($sortedArray);

?>

输出:

Array
(
    [0] => Core Duo
    [1] => Core 2 Duo
    [2] => Core Quad
    [3] => Core 4 Quad
)
于 2013-10-02T05:33:17.637 回答