/**
* 获取正确版本号
*
* @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',
),
)