版本排序

    /**
     * 获取正确版本号
     *
     * @param string|null $version 版本号字符串
     * @return string 提取的版本号,无法识别时返回空字符串
     */
    private function versionFilter(?string $version): string
    {
        if (empty($version)) {
            return '';
        }
        $pattern = '/\d+(?:[.\-_]\d+)+/';
        return preg_match($pattern, trim($version), $matches) ? $matches[0] : '';
    }

    /**
     * 软件版本号排序
     *
     * @param array  $versions 版本数组
     * @param string $column   版本号字段名
     * @param string $sort     排序方向 (ASC|DESC)
     * @return array 排序后的数组
     */
    public function versionSort(array $versions, string $column = 'version', string $sort = 'DESC'): array
    {
        if (count($versions) <= 1) {
            return $versions;
        }

        $isDesc = strtoupper($sort) === 'DESC';

        // 预计算版本号,避免 usort 对同一元素多次调用 versionFilter(Schwartzian transform)
        $decorated = array_map(function ($item) use ($column) {
            return [$this->versionFilter($item[$column] ?? ''), $item];
        }, $versions);

        usort($decorated, function ($a, $b) use ($isDesc) {
            $vA = $a[0];
            $vB = $b[0];

            // 空版本号(无法解析)统一排到末尾
            if ($vA === $vB) {
                return 0;
            }
            if ($vA === '') {
                return 1;
            }
            if ($vB === '') {
                return -1;
            }

            return $isDesc
                ? version_compare($vB, $vA)
                : version_compare($vA, $vB);
        });

        return array_column($decorated, 1);
    }

       $version = [
            [
                "id" => 259256,
                "app_hub_id" => 11142,
                "version" => "1.0.1"
            ],
            [
                "id" => 11637,
                "app_hub_id" => 11142,
                "version" => "1.0.4"
            ],
            [
                "id" => 11637,
                "app_hub_id" => 11142,
                "version" => "1.0.5"
            ],
            [
                "id" => 11637,
                "app_hub_id" => 11142,
                "version" => "1.0.5.1"
            ],
            [
                "id" => 11637,
                "app_hub_id" => 11142,
                "version" => "1.0.6"
            ],
            [
                "id" => 11637,
                "app_hub_id" => 11142,
                "version" => "1.0.6.1"
            ],
            [
                "id" => 11637,
                "app_hub_id" => 11142,
                "version" => "1.0.6.2"
            ],
            [
                "id" => 11637,
                "app_hub_id" => 11142,
                "version" => "2.0"
            ],
            [
                "id" => 11637,
                "app_hub_id" => 11142,
                "version" => "12.0"
            ]
        ];


        $info =  $this->versionSort($version);

        var_export($info);

array (
  0 => 
  array (
    'id' => 11637,
    'app_hub_id' => 11142,
    'version' => '12.0',
  ),
  1 => 
  array (
    'id' => 11637,
    'app_hub_id' => 11142,
    'version' => '2.0',
  ),
  2 => 
  array (
    'id' => 11637,
    'app_hub_id' => 11142,
    'version' => '1.0.6.2',
  ),
  3 => 
  array (
    'id' => 11637,
    'app_hub_id' => 11142,
    'version' => '1.0.6.1',
  ),
  4 => 
  array (
    'id' => 11637,
    'app_hub_id' => 11142,
    'version' => '1.0.6',
  ),
  5 => 
  array (
    'id' => 11637,
    'app_hub_id' => 11142,
    'version' => '1.0.5.1',
  ),
  6 => 
  array (
    'id' => 11637,
    'app_hub_id' => 11142,
    'version' => '1.0.5',
  ),
  7 => 
  array (
    'id' => 11637,
    'app_hub_id' => 11142,
    'version' => '1.0.4',
  ),
  8 => 
  array (
    'id' => 259256,
    'app_hub_id' => 11142,
    'version' => '1.0.1',
  ),
)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容