PHP数组排序:如何按前缀升序、尺寸后缀升序排列分隔元素?
解决PHP数组按前缀+尺寸排序的问题
你的代码目前只按尺寸后缀排序,所以会出现同尺寸的不同前缀元素混排的情况。要实现先按前缀(如GL001、GL002)升序,再按尺寸后缀升序,需要修改排序逻辑,先对比前缀,前缀相同再对比尺寸。
修正后的代码
function cmp($a, $b) { $sizes = array( "XS" => 0, "S" => 1, "M" => 2, "L" => 3, ); // 拆分前缀和尺寸,用list更直观 list($prefix_a, $size_a) = explode("_", $a); list($prefix_b, $size_b) = explode("_", $b); // 先比较前缀,前缀不同直接返回结果 $prefixCompare = $prefix_a <=> $prefix_b; if ($prefixCompare !== 0) { return $prefixCompare; } // 前缀相同的情况下,再比较尺寸 return $sizes[$size_a] <=> $sizes[$size_b]; } $array = array("GL001_M","GL001_XS","GL001_S", "GL001_L","GL002_M","GL002_XS", "GL002_S","GL002_L"); usort($array,"cmp"); foreach($array as $arrayItem){ echo $arrayItem.' | '; }
运行结果
GL001_XS | GL001_S | GL001_M | GL001_L | GL002_XS | GL002_S | GL002_M | GL002_L |
逻辑说明
- 用
list()拆分元素的前缀和尺寸,比直接取数组下标更清晰易读 - 优先对比前缀的字符串顺序:
$prefix_a <=> $prefix_b会返回-1、0或1,对应前缀的大小关系 - 只有当前缀完全相同时,才会进入尺寸的比较逻辑,这样就能保证同一前缀的元素按尺寸排序,不同前缀的元素按前缀分组排序
内容的提问来源于stack exchange,提问作者Gabriel91
相关产品推荐
相关产品推荐

