没有不值得去解决的问题,也没有不值得去学习的技术!

在 PHP 7.4 中,基于语义化版本的目录名称,从低到高逐一执行目录中的脚本文件

需要针对目录重新排序(仅获取最后一级目录)。打印结果

作者:

在

, ,

1、现阶段目录列表如下:v2.0.15-rc.6、v2.0.15-rc.7、v2.0.15、v2.0.16-hotfix.2、v2.0.16-hotfix.3、v2.0.16、v2.0.17-rc.0、v2.0.20。如图1

现阶段目录列表如下:v2.0.15-rc.6、v2.0.15-rc.7、v2.0.15、v2.0.16-hotfix.2、v2.0.16-hotfix.3、v2.0.16、v2.0.17-rc.0、v2.0.20
图1

2、获取给定目录的所有子目录,将 glob() 与 GLOB_ONLYDIR 选项一起使用。

PHP

$directories = glob(module_path('ThemeStoreDB') . '/Resources/setting_migrations' . '/*' , GLOB_ONLYDIR);
print_r($directories);
exit;

3、打印结果如下,符合预期。如图2

打印结果如下,符合预期
图2
Plaintext

Array
(
    [0] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.15
    [1] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.15-rc.6
    [2] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.15-rc.7
    [3] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.16
    [4] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.16-hotfix.2
    [5] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.16-hotfix.3
    [6] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.17-rc.0
    [7] => E:\wwwroot\object\Modules/ThemeStoreDB/Resources/setting_migrations/v2.0.20
)


4、需要针对目录重新排序(仅获取最后一级目录)。打印结果,如图3

需要针对目录重新排序(仅获取最后一级目录)。打印结果
图3
PHP

$directories = glob(module_path('ThemeStoreDB') . '/Resources/setting_migrations' . '/*' , GLOB_ONLYDIR);
print_r(array_map(fn($directory): string => pathinfo($directory)['basename'], $directories));
// print_r($directories);
exit;

Plaintext

Array
(
    [0] => v2.0.15
    [1] => v2.0.15-rc.6
    [2] => v2.0.15-rc.7
    [3] => v2.0.16
    [4] => v2.0.16-hotfix.2
    [5] => v2.0.16-hotfix.3
    [6] => v2.0.17-rc.0
    [7] => v2.0.20
)


5、目录顺序不正确,usort — 使用用户自定义的比较函数对数组中的值进行排序。version_compare — 对比两个「PHP 规范化」的版本数字字符串。排序符合预期。如图4

目录顺序不正确,usort — 使用用户自定义的比较函数对数组中的值进行排序。version_compare — 对比两个「PHP 规范化」的版本数字字符串。排序符合预期
图4
PHP

$directories = glob(module_path('ThemeStoreDB') . '/Resources/setting_migrations' . '/*' , GLOB_ONLYDIR);
$versions = array_map(fn($directory): string => pathinfo($directory)['basename'], $directories);
usort($versions, 'version_compare');
// print_r(array_map(fn($directory): string => pathinfo($directory)['basename'], $directories));
print_r($versions);
exit;

Plaintext

Array
(
    [0] => v2.0.15-rc.6
    [1] => v2.0.15-rc.7
    [2] => v2.0.15
    [3] => v2.0.16-hotfix.2
    [4] => v2.0.16-hotfix.3
    [5] => v2.0.16
    [6] => v2.0.17-rc.0
    [7] => v2.0.20
)


6、当版本 v2.0.15 升级至 v2.0.17-rc.0 时,其需要执行的目录为:v2.0.16-hotfix.2、v2.0.16-hotfix.3、v2.0.16、v2.0.17-rc.0。先过滤,再排序。最终实现如下。如图5

当版本 v2.0.15 升级至 v2.0.17-rc.0 时,其需要执行的目录为:v2.0.16-hotfix.2、v2.0.16-hotfix.3、v2.0.16、v2.0.17-rc.0。先过滤,再排序。最终实现如下
图5
PHP

$directories = glob(module_path('ThemeStoreDB') . '/Resources/setting_migrations' . '/*', GLOB_ONLYDIR);
$versions = array_map(fn($directory): string => pathinfo($directory)['basename'], $directories);
$fromVersion = 'v2.0.15';
$toVersion = 'v2.0.17-rc.0';
$pendingVersions = array_filter($versions, function ($v) use ($fromVersion, $toVersion) {
	return version_compare($v, $fromVersion, '>') && version_compare($v, $toVersion, '<=');
});
usort($pendingVersions, 'version_compare');
print_r($pendingVersions);
exit;

Plaintext

Array
(
    [0] => v2.0.16-hotfix.2
    [1] => v2.0.16-hotfix.3
    [2] => v2.0.16
    [3] => v2.0.17-rc.0
)


关于作者 · 持续学习与技术实践

我是一名拥有 15 年以上开发经验的技术从业者,自 2013 年起持续运营个人技术博客,记录工作与个人项目中遇到的真实问题,以及解决问题过程中的探索、实践和思考。

除了技术写作,我也在持续开发和维护自己的独立项目,探索新技术和新工具在实际场景中的应用。我始终相信,没有不值得去解决的问题,也没有不值得去学习的技术。

如果这篇文章对你有所帮助,欢迎浏览博客中的其他文章,也欢迎交流技术经验与想法。

关于我  ·  GitHub  ·  邮件联系

评论

3 条对“在 PHP 7.4 中,基于语义化版本的目录名称,从低到高逐一执行目录中的脚本文件”的回复

  1. […] 1. Reference: In PHP 7.4, execute script files in directories one by one from lowest to highest based on semantic … […]