PHP按年份数值与字母顺序排序年份-车型数组求助
解决PHP数组按年份数值+字母顺序排序的问题
嘿,我来帮你搞定这个排序难题!你的数组元素是「年份+品牌+车型」的组合字符串,要实现按年份数值排序、年份相同则按字母顺序排列的需求,用PHP的自定义排序函数就能轻松解决。
具体实现方案
我们可以用uasort()(如果不需要保留原数组键名就用usort())配合自定义比较逻辑,先提取年份做数值比较,再处理同一年份的字母排序:
// 你的去重后数组 $vehicleArray = [ 0 => '2012 Jeep Liberty', 7 => '2011 Jeep Liberty', 12 => '2010 Jeep Liberty', 15 => '2009 Jeep Liberty', 18 => '2008 Jeep Liberty', 22 => '2007 Jeep Liberty', 26 => '2006 Jeep Liberty', 33 => '2006 Jeep Wrangler', // 其他元素... ]; // 自定义排序逻辑 uasort($vehicleArray, function($itemA, $itemB) { // 提取年份并转为整数,确保数值比较而非字符串比较 $yearA = (int) explode(' ', $itemA)[0]; $yearB = (int) explode(' ', $itemB)[0]; // 优先按年份排序:这里是降序(最新年份在前),要升序就改成 $yearA - $yearB if ($yearA !== $yearB) { return $yearB - $yearA; } // 年份相同时,按品牌+车型的字母顺序排序(不区分大小写) $modelA = substr($itemA, 5); // 去掉前面的「年份 」(4位年份+空格共5个字符) $modelB = substr($itemB, 5); return strcasecmp($modelA, $modelB); }); // 输出结果 print_r($vehicleArray);
代码说明
- 年份提取与比较:用
explode()拆分字符串取第一个元素,转成整数避免字符串比较的坑(比如"2010"字符串比"2009"小,但数值上是更大的)。 - 排序方向控制:年份比较部分,
$yearB - $yearA是降序,换成$yearA - $yearB就是升序,按需调整。 - 同年份字母排序:用
strcasecmp()做不区分大小写的字母比较,确保"Jeep Liberty"和"jeep wrangler"也能正确排序,substr()用来去掉前面的年份部分,只比较品牌车型。 - 键名保留:如果需要保留原数组的键(比如你的[0]、[7]这些索引),就用
uasort(),否则用usort()会重置索引为连续数字。
内容的提问来源于stack exchange,提问作者Brian Bruman
相关产品推荐
相关产品推荐

