php 对字符串数组进行排序,就像字符串中间的数字位于字符串的末尾一样

yzuktlbb  于 2023-04-28  发布在  PHP
关注(0)|答案(3)|浏览(154)

我有一个数组的值,我想按字母顺序排序,* 但 * 与数字排序后的字符。
例如,给定以下字符串:

$array = [
    '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“如果你遇到一个数字,把它排序,就像它在sting的末尾一样”?

siv3szwd

siv3szwd1#

看起来你所追求的是一个将字符串的所有数字元素推到后面的函数,e。g.“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);
ao218c7q

ao218c7q2#

以下是您的解决方案:

<?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
)
l7wslrjt

l7wslrjt3#

为了可靠性,使用preg_replace()将所有数字子字符串移到字符串的后面,然后在array_multisort()调用中使用自然排序。(Demo

$array = [
    'Core 2 Duo',
    'Core Duo',
    'Core Quad',
    'Core 12 Duo',
    'Core 11 Duo',
    'Core 102 Duo',
    'Core 1 Duo',
    'Core 2 Quad'
];

array_multisort(
    preg_replace('/( \d+)(.*)/', '$2$1', $array),
    SORT_NATURAL,
    $array
);
var_export($array);

输出:

array (
  0 => 'Core Duo',
  1 => 'Core 1 Duo',
  2 => 'Core 2 Duo',
  3 => 'Core 11 Duo',
  4 => 'Core 12 Duo',
  5 => 'Core 102 Duo',
  6 => 'Core Quad',
  7 => 'Core 2 Quad',
)

相关问题