在 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 选项一起使用。
1 2 3 | $directories = glob (module_path( 'ThemeStoreDB' ) . '/Resources/setting_migrations' . '/*' , GLOB_ONLYDIR); print_r( $directories ); exit ; |
3、打印结果如下,符合预期。如图2
1 2 3 4 5 6 7 8 9 10 11 | 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
1 2 3 4 | $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 ; |
1 2 3 4 5 6 7 8 9 10 11 | 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
1 2 3 4 5 6 | $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 ; |
1 2 3 4 5 6 7 8 9 10 11 | 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
1 2 3 4 5 6 7 8 9 10 | $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 ; |
1 2 3 4 5 6 7 | Array ( [0] => v2.0.16-hotfix.2 [1] => v2.0.16-hotfix.3 [2] => v2.0.16 [3] => v2.0.17-rc.0 ) |
1 条回复
[…] […]