在 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
2、获取给定目录的所有子目录,将 glob() 与 GLOB_ONLYDIR 选项一起使用。
$directories = glob(module_path('ThemeStoreDB') . '/Resources/setting_migrations' . '/*' , GLOB_ONLYDIR); print_r($directories); exit;
3、打印结果如下,符合预期。如图2
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
$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;
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
$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;
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
$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;
Array ( [0] => v2.0.16-hotfix.2 [1] => v2.0.16-hotfix.3 [2] => v2.0.16 [3] => v2.0.17-rc.0 )
1 条回复
[…] […]