优先用 usort() 或 array_multisort() 排序 JSON 解析的多维数组:usort() 灵活但重置键名,array_multisort() + array_column() 可保留原始字符串键;排序后需 array_values() 保证 JSON 输出顺序正确。

直接用 usort() 或 array_multisort(),别碰 sort() ——它只对一维数组有效,对 JSON 解析出的多维数组会静默失败或打乱结构。
usort() 配合匿名函数是最常用、最灵活的方式
JSON 解析后得到的是 PHP 关联数组(如 json_decode($json, true)),每个元素通常是子数组。要按其中某个字段(比如 nilai_pengetahuan)排序,usort() 是首选。
- 它不依赖键名是否存在,可加
?? 0或isset()防止 Notice - 升序写
return $a['field'] $b['field'];,降序就调换顺序:$b['field'] $a['field'] - 注意:排序后原数组索引重置为数字键(0,1,2…),原始字符串键名丢失
- 如果元素里有空值或非数字字段(如
"10,001+"),得先做清洗或映射,否则数值比较会出错
array_multisort() + array_column() 适合需保留原始键名的场景
当你的 JSON 数组是关联形式(例如键为学号 "S001"、"S002"),又想按 nilai_pengetahuan 排序但保留这些键,就得用 array_multisort()。
- 先用
array_column($data, 'nilai_pengetahuan')提取所有值,生成辅助排序列 - 再调用
array_multisort($scores, SORT_ASC, $data)——注意顺序:辅助列在前,原数组在后 - 若字段缺失,
array_column()返回NULL,会导致该行排到最前(升序)或最后(降序),建议提前用array_filter()或填充默认值 - 这个组合不改变原数组的键名映射,适合后续要按 ID 查找的逻辑
排序后输出 JSON 时顺序错乱?记得用 array_values()
PHP 的 json_encode() 对关联数组(键为字符串)会保持键名,但对索引数组(键为数字)会按数字顺序排列——哪怕你刚用 usort() 排好序,只要键不是连续整数,json_encode() 可能“自作主张”重排。
立即学习“PHP免费学习笔记(深入)”;
- 保险做法:排序完成后,统一过一遍
array_values($sorted_data),强制重置为 0-based 索引 - 尤其当你把排序结果再传给前端表格或图表库时,这个步骤不能省
- 如果原始数据是对象数组(
json_decode($json, false)),得先转成关联数组再操作,否则usort()会报错
真正容易被忽略的点是:排序必须发生在数据渲染或 json_encode() 之前,且中间不能有覆盖原变量的操作;很多问题其实不是排序函数没用,而是变量被重复赋值或条件分支漏处理了。



















