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

2. To get all subdirectories of a given directory, use glob() with the GLOB_ONLYDIR option.
$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

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

$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. 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

$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. 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

$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
)
