php - PHP按字母和数字排序数组
问题描述
假设我有一系列 iPhone 型号['iPhone 11', 'iPhone 5', 'iPhone XS', 'iPhone 12']
需要按这种方式排序['iPhone 12', 'iPhone 11', 'iPhone 5', 'iPhone XS']
。我尝试的是使用本机排序(pg sort())函数或尝试从 DB 直接 orderBy,但所有解决方案都给了我这个输出['iPhone 11', 'iPhone 12', 'iPhone 5', 'iPhone XS']
。有没有人有一些解决方案/想法应该怎么做?经过所有尝试后,我感到非常沮丧。
解决方案
您需要usort 功能。例如,
function getPhoneModel($phoneName) {
$regex = "/iPhone (.+)$/";
preg_match($regex, $phoneName, $matches);
$model = $matches[1];
if ($model === 'XS') {
$model = 1;
}
return intval($model);
}
$phones = ['iPhone 11', 'iPhone 5', 'iPhone XS', 'iPhone 12'];
usort($phones, function($phoneNameA, $phoneNameB) {
$a = getPhoneModel($phoneNameA);
$b = getPhoneModel($phoneNameB);
if ($a > $b) {
return (-1);
} elseif ($a < $b) {
return 1;
} else {
return 0;
}
});
print_r($phones);
这将导致
Array
(
[0] => iPhone 12
[1] => iPhone 11
[2] => iPhone 5
[3] => iPhone XS
)
推荐阅读
- google-cloud-functions - 尝试运行 Google Cloud Scheduler 任务时出现 PERMISSION_DENIED 错误
- bash - bash 脚本无法在 while 循环中删除 s3 对象
- amazon-web-services - AWS EMR sts 承担临时集群的角色调用
- multithreading - 为什么在尝试使用锁定例程时会出现分段错误?
- android - 如何在不使用解码器的情况下将视频帧直接馈送到编码器表面?
- python - Pandas - 在 group_by 之后将自定义函数应用于两列 - 重新制定
- csv - pentaho 将 2 列从不同的 csv 中分开
- javascript - Gulp watch 什么都不做
- javascript - 如果有人向他发送 PM,如何向我的 Discord Bot 设置标准消息?
- spring-boot - spring rabbitmq 防止OOM