我需要根据数组元素包含的整数值对其进行排序。
当前输出为:
array[0] -> Indica 4 PAX
array[1] -> Indigo/swif Dezire/Etios 11 PAX
array[2] -> Tavera 8-10 PAX
array[3] -> Innova 10 PAX
array[4] -> Tempo Traveller 7-9 PAX
但实际上我需要的是:
array[0] -> Indica 4 PAX
array[1] -> Tempo Traveller 7-9 PAX
array[2] -> Tavera 8-10 PAX
array[3] -> Innova 10 PAX
array[4] -> Indigo/swif Dezire/Etios 11 PAX
发布于 2018-02-16 20:03:11
您的问题上有mysql
标记,所以我假设您的数据来自结果集行。我还看到您的所有数值都是字符串中倒数第二个非空格的子字符串。
因此,可以使用下面的ORDER BY
子句在mysql查询中有效地处理排序过程:(SQLFiddle)
ORDER BY CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(`yourfieldname`,' ',-2),' ',1) AS UNSIGNED),`yourfieldname`
上面的子句说:分离倒数第二个子串,并将其转换为无符号数字。这确保了执行“自然排序”(这样12
就不会在3
之前出现)。作为第二个排序条件,我使用完整字符串来打破平局。
也就是说,如果您的实际字符串并不总是遵循这种结构,那么我接下来推荐使用array_multisort()
,因为它执行的迭代正则表达式函数调用较少。
代码:(Demo)
$order=preg_replace('~\D+~','',$array); // generates: ['4','11','10','10','9']
array_multisort($order,$array); // sort $array as $order is sorted
var_export($array);
你甚至可以把它写成一行代码:(Demo)
array_multisort(preg_replace('~\D+~','',$array),$array);
var_export($array);
*用于处理连字符的数字子字符串的模式调整:~-\d+|\D+~
这将删除非数字字符和跟在连字符后面的数字。
以上所有方法都将接受此输入:
$array=[
'Indica 4 PAX',
'Indigo/swif Dezire/Etios 11 PAX',
'Tavera 10 PAX',
'Innova 10 PAX',
'Tempo Traveller 9 PAX'
];
并提供以下输出:
array (
0 => 'Indica 4 PAX',
1 => 'Tempo Traveller 9 PAX',
2 => 'Innova 10 PAX',
3 => 'Tavera 10 PAX',
4 => 'Indigo/swif Dezire/Etios 11 PAX',
)
发布于 2018-02-16 20:42:17
如果您有两个相同的整数,那么最终您可能希望按名称进行子排序。
<?php
$data=[
'Indica 4 PAX',
'Indigo/swif Dezire/Etios 11 PAX',
'Tavera 10 PAX',
'Innova 10 PAX',
'Tempo Traveller 9 PAX'
];
$int_filter = function($str) {
return filter_var($str, FILTER_SANITIZE_NUMBER_INT);
};
$sorter = function($a, $b) use ($int_filter) {
$cmp = $int_filter($a) <=> $int_filter($b);
if($cmp === 0)
$cmp = $a <=> $b;
return $cmp;
};
uasort($data, $sorter);
var_export($data);
输出:
array (
0 => 'Indica 4 PAX',
4 => 'Tempo Traveller 9 PAX',
3 => 'Innova 10 PAX',
2 => 'Tavera 10 PAX',
1 => 'Indigo/swif Dezire/Etios 11 PAX',
)
发布于 2018-02-16 20:00:44
也许你会喜欢用这个。
我刚刚引用了一个来自php manual的例子。
<?php
$arr = [];
$arr[0] = 'Indica 4 PAX';
$arr[1] = 'Indigo/swif Dezire/Etios 11 PAX';
$arr[2] = 'Tavera 10 PAX';
$arr[3] = 'Innova 10 PAX';
$arr[4] = 'Tempo Traveller 9 PAX';
function cmp($a, $b) {
$a = filter_var($a, FILTER_SANITIZE_NUMBER_INT);
$b = filter_var($b, FILTER_SANITIZE_NUMBER_INT);
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
uasort($arr, 'cmp');
var_dump($arr);
?>
https://stackoverflow.com/questions/48825809
复制相似问题