$array = array(
'list1 - 1',
'list7 - 1',
'list5 - 2',
'list3 - 1'
);
我需要对该数组进行数字排序。该函数应该检查等号后面的值进行排序。
list1 - 1
list7 - 1
list3 - 1
list5 - 2
创建自定义排序并通过
usort
函数执行
function mysort($a,$b)
{
$a = substr($a,-1,1);
$b = substr($b,-1,1);
if ($a == $b)
{
return 0;
}
return ($a < $b) ? -1 : 1;
}
然后将其与数组一起传递到 usort 中,如下所示:
usort($myarray, "myarray");
--
您的请求很难完成,因为您想要对没有逻辑标识符的数组进行排序,我们的大脑尽可能解释您的结果,但不创建矩阵,硬编码的概念很难完成,您最好的选择是如果该类始终与上面的完全相同,然后手动执行此操作:
$temp = $array[3];
$array[3] = $array[4];
$array[4] = $temp;
看起来您想首先搜索尾随数字,但如果它们相同,那么您想保留项目的原始顺序。 这意味着需要更多的思考,但工作本质上仍然非常简单。
$array = array(
'list1 - 1',
'list7 - 1',
'list5 - 2',
'list3 - 1',
);
function sort_list(&$subject) {
// Get an array of the trailing numbers to use within the callback
$nums = preg_replace('/^.* - (\d+)$/', '$1', $subject);
// Sort values by trailing number or key
uksort($subject, function($a,$b) use ($nums) {
// If numbers are the same, sort by key
if ($nums[$a] === $nums[$b]) {
return $a - $b;
}
// Othwerise sort by numbers
return $nums[$a] - $nums[$b];
});
}
sort_list($array);
var_dump($array);
输出类似:
array(4) {
[0]=>
string(9) "list1 - 1"
[1]=>
string(9) "list7 - 1"
[3]=>
string(9) "list3 - 1"
[2]=>
string(9) "list5 - 2"
}
其中
$array
是数组的名称。如果数字大于 1 位,则此功能有效。
function custom_sort($a, $b)
{
$exp = '/(\d+)$/';
preg_match($exp, $a, $a);
preg_match($exp, $b, $b);
return intval($a[1]) - intval($b[1]);
}
usort($array, 'custom_sort');
PHP 确保从 PHP8 开始稳定排序,因此在
explode()
内部使用 usort()
调用将允许隔离尾随数字,并且 spaceship 运算符会将数字评估为整数值。 演示
usort(
$array,
fn($a, $b) => explode(' - ', $a)[1]
<=>
explode(' - ', $b)[1]
);
var_export($array);
function mySort($array) {
foreach ($array as $key => $value) {
$array[$key] = explode(" - ", $array[$key]);
$data[$value] = $array[$key][1];
}
asort($data);
}