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

自然な並べ替えは、通常の並べ替えと同じ結果を返します。

では、「数値に遭遇した場合は、Z の後に来るように並べ替えてください」のように PHP に伝える方法はありますか?

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 に答える