如何用usort对PHP数组的动态服装尺码表头排序?
解决方法
你需要先定义好表头的目标顺序,再根据这个顺序重新排列子数组的键,这样输出表头和数据时就能按照你想要的尺码顺序展示了。
具体步骤:
- 先定义包含
Loc和目标尺码顺序的数组,把Loc放在最前面,然后是从小到大的尺码:XS、S、M、L、XL; - 从结果数组中提取第一个子数组的键,再根据定义好的顺序对这些键进行排序;
- 输出表头和表格数据时,都按照这个排序后的键列表来遍历,而非直接使用子数组的默认键顺序。
修改后的完整PHP代码:
<?php // 你的原始结果数组 $result = [ ['Loc' => '001', 'L' => 2, 'M' => 3, 'S' => 3, 'XS' => 1], ['Loc' => '006', 'L' => 0, 'M' => 2, 'S' => 3, 'XS' => 1], ['Loc' => '012', 'L' => 2, 'M' => 2, 'S' => 2, 'XS' => 2] ]; // 定义表头的目标顺序:先Loc,再从小到大的尺码 $headerOrder = ['Loc', 'XS', 'S', 'M', 'L', 'XL']; // 获取第一个子数组的键,然后按照headerOrder排序 $originalKeys = array_keys($result[0]); usort($originalKeys, function($a, $b) use ($headerOrder) { // 找到每个键在目标顺序中的位置,不存在的话放到最后 $posA = array_search($a, $headerOrder) !== false ? array_search($a, $headerOrder) : count($headerOrder); $posB = array_search($b, $headerOrder) !== false ? array_search($b, $headerOrder) : count($headerOrder); return $posA - $posB; }); // 输出表头 echo '<tr>'; foreach($originalKeys as $key) { echo ' <th colspan="1" style="width: 30px">'.$key.'</th>'; } echo '</tr>'; // 输出表格数据 foreach($result as $row) { echo '<tr>'; foreach($originalKeys as $key) { // 处理可能不存在的键(比如XL),如果没有值就显示空或者0 $value = isset($row[$key]) ? $row[$key] : ''; echo '<td>'.$value.'</td>'; } echo '</tr>'; } ?>
代码说明:
- 表头排序逻辑:用
usort对原始键数组排序,通过array_search获取每个键在目标顺序中的位置,位置小的排在前面;如果某个键不在目标顺序里(比如未来新增的其他键),会被自动放到最后。 - 数据输出:遍历排序后的键列表,对应取每一行的数据,就算某个尺码(比如XL)在当前数据里没有,也会预留表头位置,值默认显示为空(你可以改成
0或者其他自定义默认值)。 - 既保留了
Loc列在最前面的位置,又把尺码按照从小到大的顺序重新排列,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Bldjef
相关产品推荐
相关产品推荐

