Java compareTo函数功能解析及Java排序代码转PHP实现问询
嘿,我来帮你理清这段Java代码的作用,再给你对应的PHP实现方案~
一、Java代码功能解析
先看你贴的这段代码:
contentsList.sort((ClassBook c1, ClassBook c2)->c1.getClassDate().compareTo(c2.getClassDate()));
这段代码核心就是对存储ClassBook对象的列表contentsList做升序排序,排序的依据是每个ClassBook实例里的classDate属性:
- 用了Java 8的Lambda表达式当排序比较器,同时拿两个
ClassBook对象c1和c2来对比 - 通过
getClassDate()方法获取各自的日期对象(应该是java.util.Date或者java.time.LocalDate这类自带比较能力的日期类型) - 调用日期对象的
compareTo()方法:如果c1的日期比c2早,返回负数,排序后c1排在前面;日期相等返回0;c1日期更晚的话返回正数,c2就会排在前面,最终整个列表会按日期从小到大排列好
二、PHP实现方案
在PHP里,我们用usort()函数就能实现同样的逻辑,它支持自定义排序规则。下面分两种常见场景给你代码:
场景1:ClassBook的getClassDate()返回PHP的DateTime对象
如果你的PHP版ClassBook类里,getClassDate()返回的是PHP自带的DateTime对象,那可以直接用DateTime::compare()方法来做比较:
// $contentsList是存储ClassBook对象的PHP数组 usort($contentsList, function(ClassBook $c1, ClassBook $c2) { // DateTime::compare会返回-1/0/1,对应c1日期早于/等于/晚于c2,刚好符合usort的要求 return DateTime::compare($c1->getClassDate(), $c2->getClassDate()); });
场景2:getClassDate()返回时间戳或标准格式的日期字符串
如果getClassDate()返回的是整数时间戳,或者像'Y-m-d'这种可以直接字符串比较的日期格式,代码可以更简洁:
usort($contentsList, function(ClassBook $c1, ClassBook $c2) { $date1 = $c1->getClassDate(); $date2 = $c2->getClassDate(); if ($date1 === $date2) { return 0; } // 升序逻辑:早的日期排在前面,所以date1比date2小就返回-1,否则返回1 return $date1 < $date2 ? -1 : 1; });
小补充:降序排序怎么改?
如果需要按日期从晚到早排序,只需要把返回值反转就行:
- 比如场景1里改成
return -DateTime::compare($c1->getClassDate(), $c2->getClassDate()); - 场景2里改成
return $date1 > $date2 ? -1 : 1;
另外,PHP 7.4及以上版本支持箭头函数,代码可以写得更紧凑,比如场景1可以改成:
usort($contentsList, fn(ClassBook $c1, ClassBook $c2) => DateTime::compare($c1->getClassDate(), $c2->getClassDate()));
内容的提问来源于stack exchange,提问作者Eljay
相关产品推荐
相关产品推荐

