PHP usort多维数组排序求助:无法按sort键值完成排序
解决usort对多维数组按sort键排序的问题
嘿,我猜你是在写usort的回调函数时卡壳了吧?你的需求很明确:基于每个子数组里的sort键(看起来是时间戳)对多维数组排序,咱们直接上正确的实现,再说说可能踩的坑。
首先,先把你给出的原始数组整理成更清晰的格式:
$array = [ ['sort' => 1520546956, 'row' => 'Data lives here'], ['sort' => 1521047928, 'row' => 'Data lives here'], ['sort' => 1520525366, 'row' => 'Data lives here'], ['sort' => 1520525227, 'row' => 'Data lives here'], ];
正确的排序实现(PHP7+推荐)
PHP7引入的太空船运算符(<=>)让数组排序的回调函数超级简洁,直接比较两个元素的sort值就行:
usort($array, function($a, $b) { // 升序排序:小的时间戳在前 return $a['sort'] <=> $b['sort']; // 如果要降序,反过来写:return $b['sort'] <=> $a['sort']; });
兼容PHP5的写法
如果你的项目还在使用PHP5,就用传统的比较逻辑返回-1/0/1:
usort($array, function($a, $b) { if ($a['sort'] == $b['sort']) { return 0; } // 升序:return $a['sort'] < $b['sort'] ? -1 : 1; // 降序:return $a['sort'] > $b['sort'] ? -1 : 1; return $a['sort'] < $b['sort'] ? -1 : 1; });
为什么你之前的代码可能出问题?
你提到写了forea...,大概率是误用了循环——usort不需要提前遍历数组,它会自动遍历并调用回调函数比较每一组元素。另外还要注意两个关键点:
- usort是原地排序,会直接修改原数组,如果需要保留原数组,先复制一份再排序:
$sortedArray = $array; usort($sortedArray, ...); - 确保所有子数组都有
sort键,否则会触发PHP警告,可以在回调里加判断(比如isset($a['sort'], $b['sort'])),避免报错。
排序后的结果(升序)
运行上面的代码后,你的数组会变成按sort值从小到大排列:
Array ( [0] => Array ( [sort] => 1520525227 [row] => Data lives here ) [1] => Array ( [sort] => 1520525366 [row] => Data lives here ) [2] => Array ( [sort] => 1520546956 [row] => Data lives here ) [3] => Array ( [sort] => 1521047928 [row] => Data lives here ) )
内容的提问来源于stack exchange,提问作者Jason




