There is no problem not worth solving, and no technology not worth learning!

In PHP 7.4, the script files in the directory are executed one by one based on the directory name of the semantic version

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

1. The list of catalogs at this stage 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

现阶段目录列表如下: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. Get all the subdirectories of the given directory and use glob() with the glob_onlydir option.


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


3. The printing results are as follows, in line with expectations. as shown in Figure 2

打印结果如下,符合预期
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. You need to reorder the directory (only get the last level directory). Print the result, as shown in Figure 3

需要针对目录重新排序(仅获取最后一级目录)。打印结果
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 — use user-defined comparison functions to sort the values in the array. version_compare — Contrast two “PHP normalized” version numeric strings. Sort as expected. as shown in Figure 4

目录顺序不正确,usort — 使用用户自定义的比较函数对数组中的值进行排序。version_compare — 对比两个「PHP 规范化」的版本数字字符串。排序符合预期
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 version v2.0.15 is upgraded to v2.0.17-rc.0 The directory that it needs to execute is: 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

当版本 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。先过滤,再排序。最终实现如下
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
)



Need long-term technical maintenance or remote troubleshooting?

I am a PHP / Go backend engineer with 15+ years of experience, focused on existing system maintenance, bug fixing, performance optimization, server troubleshooting, WordPress maintenance, and small feature iterations.

If your project is facing any of the following issues, we can start with a small troubleshooting task first:

  • ✅ PHP / Laravel / Yii2 legacy systems without active maintenance
  • ✅ Go / Gin backend APIs that need troubleshooting or optimization
  • ✅ Slow, broken, or unstable WordPress websites
  • ✅ Nginx / MySQL / Redis / Linux server issues
  • ✅ CDN / Cloudflare / DNS / HTTPS configuration problems
  • ✅ Long-term remote technical support or part-time maintenance

More details: About Me & Collaboration

WeChat: 13980074657
Email: shuijingwanwq@gmail.com
Telegram: @shuijingwan
GitHub: https://github.com/shuijingwan

评论

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.