PHP如何将混合数字与尺码字符串的数组按指定规则排序
PHP自定义数组排序问题
我有如下PHP数组:
$po = array ( 5 => '8', 6 => '10', 7 => '12', 8 => '41', 12 => '42', 9 => '43', 10 => '44', 11 => '45', 1 => 'L', 0 => 'M', 4 => 'S', 2 => 'XL', 3 => 'XXL', 13 => 'XXS' );
排序规则
- 所有数值型值优先排列,按升序排序
- 字母类尺码值按指定顺序排列:
$order = ['XXS','XS','S','M','L','XL','XXL'];
现有代码问题
原有代码仅处理了尺码的排序逻辑,没有区分数值和尺码的优先级,也没有做数值升序的判断;同时array_search找不到对应尺码时会返回false,直接做减法会被转为0,导致数值排序完全混乱。
修复后的实现代码
如果不需要保留原数组的键名,使用usort即可;如果需要保留原始键名,将usort替换为uasort:
$sizeOrder = ['XXS','XS','S','M','L','XL','XXL']; usort($po, function ($a, $b) use ($sizeOrder) { // 先判断元素类型 $aIsNumeric = is_numeric($a); $bIsNumeric = is_numeric($b); // 两者都是数值,按升序排序 if ($aIsNumeric && $bIsNumeric) { return intval($a) - intval($b); } // 仅a是数值,a优先级更高排前面 if ($aIsNumeric && !$bIsNumeric) { return -1; } // 仅b是数值,b优先级更高排前面 if (!$aIsNumeric && $bIsNumeric) { return 1; } // 两者都是尺码,按指定顺序排序 $posA = array_search($a, $sizeOrder); $posB = array_search($b, $sizeOrder); return $posA - $posB; });
最终排序结果
array ( 0 => '8', 1 => '10', 2 => '12', 3 => '41', 4 => '42', 5 => '43', 6 => '44', 7 => '45', 8 => 'XXS', 9 => 'S', 10 => 'M', 11 => 'L', 12 => 'XL', 13 => 'XXL', )
内容的提问来源于stack exchange,提问作者Europeuser
相关产品推荐
相关产品推荐

