我有一系列值,我想按字母顺序排序,但,数字按字符排序。
例如,给定以下字符串:
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之后进行排序”?
答案 0 :(得分: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);
答案 1 :(得分: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
)