无尘阁日记

无尘阁日记

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;
}

代码解析

  1. 构建 $orderMap 排序索引

    • array_flip($order) 将 $order 数组的值转换为键,索引值作为排序依据。例如:

    [

            '财务费用开表模板' => 0,

             '企业所得税开表模板' => 1,

             '营运资金开表模板' => 2,
            ......

    ]

  2. 获取数据库数据并转换格式

    • array_map() 处理数据,返回带有 Id 和 Name 的数组。

  3. 使用 usort() 进行排序

    • 取 orderMap 里的索引进行比较,确保 $a['Name'] 在 $order 里的顺序靠前。

    • 如果 $a['Name'] 或 $b['Name'] 不在 $orderMap,默认放到最后(用 PHP_INT_MAX 处理)。

效果

按 $order 数组指定的顺序返回 getModules 结果,如果数据库返回的 Name 不在 $order 里,则默认排在最后。

这样,你就能按照你提供的顺序来排列返回的数据! 🚀


prompt:

$modules = [
   '财务费用开表模板',
   '企业所得税开表模板',
   '营运资金开表模板',
   '固定资产开表模板',
   '无形资产开表模板',
   '使用权资产开表模板',
   '长期待摊费用开表模板',
   '其他非流动资产开表模板',
   '长期经营性资产模版(按明细预测)'
];

我要将以下函数返回的结果按以上顺序排序怎么做?其中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());

    }