我需要根据它包含的整数值对数组元素进行排序。
当前输出为:
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
答案 0 :(得分:2)
您的问题上有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',
)
答案 1 :(得分:1)
如果你有两个相同的整数,那么你最终可能想要按名称进行子排序。
<?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',
)
答案 2 :(得分:0)
可能你会喜欢这个。
我刚从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);
?>
答案 3 :(得分:0)
<?php
$data =
[
'Catnip 23 units',
'Cheezy chips 18 units',
'Refried beans 21 units'
];
$int_filter = function($str) {
return filter_var($str, FILTER_SANITIZE_NUMBER_INT);
};
$int_values = array_map($int_filter, $data);
asort($int_values); // Order int_values and maintain keys.
$ordered = array_replace($int_values, $data);
var_export($ordered);
输出:
array (
1 => 'Cheezy chips 18 units',
2 => 'Refried beans 21 units',
0 => 'Catnip 23 units',
)