假设我有一个iPhone模型数组['iPhone 11', 'iPhone 5', 'iPhone XS', 'iPhone 12'],它需要在这个均值['iPhone 12', 'iPhone 11', 'iPhone 5', 'iPhone XS']中排序。我尝试过使用本机排序(p.g.sort())函数,或者尝试过直接从DB排序,但所有的解决方案都给出了这个输出['iPhone 11', 'iPhone 12', 'iPhone 5', 'iPhone XS']。有没有人有一些解决方案/想法应该怎么做?
发布于 2021-01-29 22:33:07
你需要usort function。例如,
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
)发布于 2021-01-30 20:15:43
这项任务描述得不够准确。
我认为这比@El_Vanja的评论更复杂。我试图说得更具体。
H19在另一种情况下,类型按升序排序。
对于这个任务,我扩展了示例数组。
$in = ['ax A', 'iPhone 11', 'iPhone 5', 'iPhone XS', 'iPhone 12', 'master 6', 'ax Z', 'ax B','xphone'];解决方案是使用usort和一个特殊的排序函数。
function specialSort($a,$b){
list($aModel,$aTyp) = explode(' ',$a.' ');
list($bModel,$bTyp) = explode(' ',$b.' ');
return $aModel <=> $bModel
?: (int)$bTyp <=> (int)$aTyp
?: $aTyp <=> $bTyp
;
}
usort($in,'specialSort')测试输出:
echo implode(' | ',$in);
//ax A | ax B | ax Z | iPhone 12 | iPhone 11 | iPhone 5 | iPhone XS | master 6 | xphone发布于 2021-01-29 22:24:04
您是否尝试过使用
array_multisort($array, SORT_NATURAL);https://stackoverflow.com/questions/65956116
复制相似问题