php解决一个排序问题:按预定义顺序排序模块列表 (getModules)
2025-02-25
你可以使用 usort
来对返回的数组按照指定顺序排序。首先,创建一个映射数组,将你提供的顺序转换为键值对(键是模板名称,值是它在排序列表中的索引)。然后,在 getModules
返回的数据上应用 usort
进行排序。
修改后的代码
public static function getModules($params) { $order = [ '财务费用开表模板', '企业所得税开表模板', '营运资金开表模板', '固定资产开表模板', '无形资产开表模板', '使用权资产开表模板', '长期待摊费用开表模板', '其他非流动资产开表模板', '长期经营性资产模版(按明细预测)' ]; // 构建一个索引映射表 $orderMap = array_flip($order); // 获取数据 $modules = array_map(function ($item) { /** @var self $item */ return [ 'Id' => $item->Id, 'Name' => $item->Name ]; }, self::find() ->where([ 'ProjectId' => $params['ProjectId'], 'ValidMethod' => $params['EevaluationMethodType'], 'IsDeleted' => 0 ]) ->all()); // 按指定顺序排序 usort($modules, function ($a, $b) use ($orderMap) { return ($orderMap[$a['Name']] ?? PHP_INT_MAX) <=> ($orderMap[$b['Name']] ?? PHP_INT_MAX); }); return $modules; }
代码解析
构建
$orderMap
排序索引:array_flip($order)
将$order
数组的值转换为键,索引值作为排序依据。例如:获取数据库数据并转换格式:
array_map()
处理数据,返回带有Id
和Name
的数组。使用
usort()
进行排序:取
orderMap
里的索引进行比较,确保$a['Name']
在$order
里的顺序靠前。如果
$a['Name']
或$b['Name']
不在$orderMap
,默认放到最后(用PHP_INT_MAX
处理)。
[
'财务费用开表模板' => 0,
'企业所得税开表模板' => 1,
'营运资金开表模板' => 2,
......
]
效果
按 $order
数组指定的顺序返回 getModules
结果,如果数据库返回的 Name
不在 $order
里,则默认排在最后。
这样,你就能按照你提供的顺序来排列返回的数据! 🚀
prompt:
'财务费用开表模板',
'企业所得税开表模板',
'营运资金开表模板',
'固定资产开表模板',
'无形资产开表模板',
'使用权资产开表模板',
'长期待摊费用开表模板',
'其他非流动资产开表模板',
'长期经营性资产模版(按明细预测)'
];
我要将以下函数返回的结果按以上顺序排序怎么做?其中Name就是以上列表的value。
public static function getModules($params) {
return array_map(function ($item) {
/** @var self $item */
return [
'Id' => $item->Id,
'Name' => $item->Name
];
}, self::find()
->where([
'ProjectId' => $params['ProjectId'],
'ValidMethod' => $params['EevaluationMethodType'],
'IsDeleted' => 0
])
->all());
}
发表评论: