基于不同列对MySQL表生成的PHP数组进行排序
嘿,我来帮你搞定这个多维数组的排序问题!你从MySQL拿到的这个二维数组,要按不同列排序其实很简单,PHP里的usort()函数配合自定义回调就能轻松实现。先把你的数组结构再明确下,方便咱们举例:
$items = [ ['id' => 1, 'parent_ID' => 0], ['id' => 2, 'parent_ID' => 0], ['id' => 3, 'parent_ID' => 2], ['id' => 4, 'parent_ID' => 2], ['id' => 5, 'parent_ID' => 2], ['id' => 6, 'parent_ID' => 1], ['id' => 7, 'parent_ID' => 1], ['id' => 8, 'parent_ID' => 1], // 其他省略项... ];
1. 按单个列排序
按id升序/降序排序
PHP7+的太空船运算符<=>特别适合做这种比较,一行就能搞定逻辑:
// 升序排序 usort($items, function($a, $b) { return $a['id'] <=> $b['id']; }); // 降序排序,只需要把$a和$b的位置调换 usort($items, function($a, $b) { return $b['id'] <=> $a['id']; });
按parent_ID升序/降序排序
逻辑和上面完全一致,只是把比较的字段换成parent_ID:
// 升序 usort($items, function($a, $b) { return $a['parent_ID'] <=> $b['parent_ID']; }); // 降序 usort($items, function($a, $b) { return $b['parent_ID'] <=> $a['parent_ID']; });
2. 按多个列组合排序
如果需要更复杂的排序规则,比如先按parent_ID分组排序,同一分组下再按id排序,也很容易实现:
usort($items, function($a, $b) { // 先比较parent_ID $parentCompare = $a['parent_ID'] <=> $b['parent_ID']; // 如果parent_ID相同,再比较id if ($parentCompare === 0) { return $a['id'] <=> $b['id']; } return $parentCompare; });
这样排序后,parent_ID为0的项会排在最前面,接着是parent_ID为1、2的分组,每个分组内部的id会从小到大排列。
兼容低版本PHP的写法
如果你的PHP版本低于7.0,没法用太空船运算符,可以手动判断大小:
// 按id升序的低版本写法 usort($items, function($a, $b) { if ($a['id'] == $b['id']) return 0; return $a['id'] > $b['id'] ? 1 : -1; });
通用排序函数(可选)
要是你经常需要对不同字段排序,可以封装一个通用函数,灵活指定排序字段和方向:
function sortMultiArray(&$array, $column, $direction = 'asc') { usort($array, function($a, $b) use ($column, $direction) { $compare = $a[$column] <=> $b[$column]; return $direction === 'desc' ? -$compare : $compare; }); } // 调用示例:按parent_ID降序排序 sortMultiArray($items, 'parent_ID', 'desc');
内容的提问来源于stack exchange,提问作者Nibboro
相关产品推荐
相关产品推荐

