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

Execute Scripts in Versioned Directories Sequentially in PHP 7.4

The directories need to be re-sorted (only fetching the last level of the directory). Print the results

1. The current directory list is as follows: 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. As shown in Figure 1

The current directory list is as follows: 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
Figure 1

2. To get all subdirectories of a given directory, use glob() with the GLOB_ONLYDIR option.

PHP

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

3. The printed results are as follows, as expected. As shown in Figure 2

The printed results are as expected
Figure 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. The directories need to be re-sorted (only fetching the last level of the directory). Print the results, as shown in Figure 3

The directories need to be re-sorted (only fetching the last level of the directory). Print the results
Figure 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. The directory order is incorrect. usort — Sorts the values of an array using a user-defined comparison function. version_compare — Compares two “PHP-standardized” version number strings. The sorting is as expected. As shown in Figure 4

The directory order is incorrect. usort — Sorts the values of an array using a user-defined comparison function. version_compare — Compares two "PHP-standardized" version number strings. The sorting is as expected
Figure 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. When upgrading from version v2.0.15 to v2.0.17-rc.0, the directories that need to be executed are: v2.0.16-hotfix.2, v2.0.16-hotfix.3, v2.0.16, v2.0.17-rc.0. Filter first, then sort. The final implementation is as follows. As shown in Figure 5

When upgrading from version v2.0.15 to v2.0.17-rc.0, the directories that need to be executed are: v2.0.16-hotfix.2, v2.0.16-hotfix.3, v2.0.16, v2.0.17-rc.0. Filter first, then sort. The final implementation is as follows
Figure 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  ·  邮件联系