讨论数量:
$array = [
"一单元六层",
"一单元一层",
"一单元三层",
"一单元五层",
"一单元七层",
"一单元四层",
"一单元八层",
"一单元二层",
];
function chineseNumberToInteger($chineseNumber)
{
$numbers = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
$helpers = array('', '十', '百', '千', '万');
$value = 0;
foreach ($numbers as $key => $number) {
if (strpos($chineseNumber, $number) !== false) {
$numberLength = mb_strlen($number);
$chineseNumber = str_replace($number, $key, $chineseNumber);
}
}
foreach ($helpers as $key => $helper) {
if (strpos($chineseNumber, $helper) !== false) {
$helperLength = mb_strlen($helper);
$chineseNumber = str_replace($helper, $key, $chineseNumber);
}
}
for ($i = 0; $i < mb_strlen($chineseNumber); $i++) {
$value += mb_substr($chineseNumber, $i, 1) * pow(10, $i);
}
return $value;
}
usort($array, function ($a, $b) {
$a = explode("单元", $a);
$b = explode("单元", $b);
$aUnit = chineseNumberToInteger($a[0]);
$aFloor = chineseNumberToInteger(rtrim($a[1], '层'));
$bUnit = chineseNumberToInteger($b[0]);
$bFloor = chineseNumberToInteger(rtrim($b[1], '层'));
if ($aUnit === $bUnit) {
return $aFloor - $bFloor;
} else {
return $aUnit - $bUnit;
}
});
dd($array);
我不清楚你为什么会考虑使用中文排序,这是一个很 幼稚 的行为,你应该考虑的不是怎么给中文排序,而是怎么样才可以不使用中文来排序!
最后借助 gpt 实现了
function chineseNumericSort($a, $b)
{
// 将中文数字替换为阿拉伯数字
$chineseToNumber = [
'一' => 1,
'二' => 2,
'三' => 3,
'四' => 4,
'五' => 5,
'六' => 6,
'七' => 7,
'八' => 8,
'九' => 9,
'十' => 10,
];
$a = preg_replace_callback('/[\x{4e00}-\x{9fa5}]+/u', function($match) use ($chineseToNumber) {
$number = 0;
$chineseArray = preg_split('//u', $match[0], -1, PREG_SPLIT_NO_EMPTY);
foreach ($chineseArray as $chinese) {
if (isset($chineseToNumber[$chinese])) {
$number = $number * 10 + $chineseToNumber[$chinese];
}
}
return $number;
}, $a['dept_name']);
$b = preg_replace_callback('/[\x{4e00}-\x{9fa5}]+/u', function($match) use ($chineseToNumber) {
$number = 0;
$chineseArray = preg_split('//u', $match[0], -1, PREG_SPLIT_NO_EMPTY);
foreach ($chineseArray as $chinese) {
if (isset($chineseToNumber[$chinese])) {
$number = $number * 10 + $chineseToNumber[$chinese];
}
}
return $number;
}, $b['dept_name']);
return (int)$a - (int)$b;
}
usort($list, 'chineseNumericSort');
最终结果
推荐文章: