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());
}
发表评论: