我必须按照注册票证的人的姓氏对预订清单(它们通过定义belongsTo关联与事件相关联)进行排序。
我在cakePHP中执行此操作:
$reservations = Set::sort($eventinfo['Reservation'],'{n}.last_name','asc');
这样可行,但有些用户以小写形式输入数据,这使得排序错误:
Alfa, Ziggy, aardvark, zorro
它应该在哪里:
aardvark, Alfa, Ziggy, zorro
我该如何解决这个问题?我可以循环遍历数组并使用ucword()使每个字符串以大写字母开头,但这看起来有点难看。是不是有一种简单的方法来改变排序算法,所以它忽略了大小写?
答案 0 :(得分:1)
我会在存储之前规范化姓氏 - 全部小写,全部大写或全部大写。
答案 1 :(得分:0)
您是否有理由不在SQL中执行排序?
我认为在您致电find
之前不久有一个Set::sort
操作,我想这看起来像是:
$reservations = $this->Event->find('first',array(
'conditions' => array('Event.id' => $my_event_id),
'contain' => array('Reservation')
));
您可以指示Cake的ORM使用与标准find
操作相同的语法对包含的预留进行排序,如下所示:
$reservations = $this->Event->find('first',array(
'conditions' => array('Event.id' => $my_event_id),
'contain' => array(
'Reservation' => array('order'=>'Reservation.last_name')
)
));
答案 2 :(得分:0)
在代码Set :: sort中看起来像是在引擎http://php.net/manual/en/function.array-multisort.php下使用array_multisort所以它不会给你不区分大小写的排序。您可以查看Set :: sort的代码,并创建自己的Set子类,使用类似natcasesort http://www.php.net/manual/en/function.natcasesort.php的东西,或者先使用mysql进行排序,默认情况下,mysql将不区分大小写排序