PHP多维数组按值而非键排序:按姓氏字母序排列学生并保留提交数据
解决方案
你选择uasort排序是完全正确的,这个函数会保留数组原有键名(学生ID),且会将每个学生的完整数组条目(包含submissions字段的所有提交数据)作为整体排序,不会出现数据分离的问题。你之前没有得到有效结果大概率是两个原因:比较函数逻辑错误,或是误将uasort的返回值当成排序后的数组使用(uasort是原地修改原数组,返回值仅为布尔类型的操作成功/失败标识)。
适配PHP7+的最简代码
直接使用匿名函数+strcmp字符串比较即可实现需求:
// 原地排序$array['students'],按lastName字母升序排列 uasort($array['students'], function($a, $b) { return strcmp($a['lastName'], $b['lastName']); }); // 排序后直接使用原$array变量即可,学生条目已经按姓氏排序,所有关联数据保留 print_r($array['students']);
兼容低版本PHP的写法
如果需要支持PHP5.x版本,可以单独定义比较函数:
function cmp_by_lastname($a, $b) { return strcmp($a['lastName'], $b['lastName']); } uasort($array['students'], 'cmp_by_lastname');
排序效果验证
按照你给出的示例数组,排序后$array['students']的条目顺序为:
- studentID=12:Amy Appleton(姓氏Appleton字母序最靠前)
- studentID=13:Zeke Lee(姓氏Lee排在第二位)
- studentID=11:John Smith(姓氏Smith排在最后)
每个学生对应的submissions提交数据会完全跟随所属学生条目移动,不会出现绑定错误。
内容的提问来源于stack exchange,提问作者Mathew
相关产品推荐
相关产品推荐

