PHP多维数组按指定月份顺序排序的实现方案
解决方案:按指定月份顺序排序多维数组
这个需求很常见,咱们可以通过构建月份顺序映射 + 自定义排序函数轻松实现,步骤如下:
1. 拆解月份数组,得到完整的有序列表
你的$monthArray里包含逗号分隔的月份组,首先得把它们拆成单个月份的有序数组:
$monthArray = array("Jan 2018,Feb 2018","Mar 2018"); $orderedMonths = []; foreach ($monthArray as $group) { // 把每个逗号分隔的月份组拆成单个元素,合并到有序列表中 $orderedMonths = array_merge($orderedMonths, explode(',', $group)); }
执行后$orderedMonths就变成了["Jan 2018", "Feb 2018", "Mar 2018"],这正是咱们需要的目标排序顺序。
2. 创建月份-顺序索引的映射
为了快速判断每个月份的排序优先级,我们把有序数组的键值互换,得到一个关联数组:
$monthOrder = array_flip($orderedMonths);
此时$monthOrder的结构为:
[ "Jan 2018" => 0, "Feb 2018" => 1, "Mar 2018" => 2 ]
每个月份对应的数值就是它的排序位置,数值越小越靠前。
3. 用自定义排序函数对$result排序
使用PHP的usort()函数,结合上面的映射数组定义排序规则:
$result = array( array( "day" => "Feb 2018", "value" => "101" ), array( "day" => "Jan 2018", "value" => "18" ), array( "day" => "Mar 2018", "value" => "0" ) ); usort($result, function($a, $b) use ($monthOrder) { // 比较两个元素对应的月份顺序索引,差值决定排序方向 return $monthOrder[$a['day']] - $monthOrder[$b['day']]; });
最终效果
执行完排序后,$result就会严格按照Jan 2018 → Feb 2018 → Mar 2018的顺序排列:
array(3) { [0]=> array(2) { ["day"]=> string(8) "Jan 2018" ["value"]=> string(2) "18" } [1]=> array(2) { ["day"]=> string(8) "Feb 2018" ["value"]=> string(3) "101" } [2]=> array(2) { ["day"]=> string(8) "Mar 2018" ["value"]=> string(1) "0" } }
内容的提问来源于stack exchange,提问作者vrock
相关产品推荐
相关产品推荐

