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

在 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
现阶段目录列表如下: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
打印结果如下,符合预期
图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
需要针对目录重新排序(仅获取最后一级目录)。打印结果
图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
目录顺序不正确,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
当版本 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
<pre class="wp-block-syntaxhighlighter-code">

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

</pre>


Array
(
    [0] => v2.0.16-hotfix.2
    [1] => v2.0.16-hotfix.3
    [2] => v2.0.16
    [3] => v2.0.17-rc.0
)



需要长期技术维护或远程问题排查?

我是拥有 15+ 年经验的 PHP / Go 后端工程师,长期关注已有系统维护、Bug 修复、性能优化、服务器排查、WordPress 网站维护和小功能迭代。

如果你的项目遇到以下情况,可以先从一次小问题排查开始合作:

  • ✅ PHP / Laravel / Yii2 老项目无人维护
  • ✅ Go / Gin 后端接口需要排查或优化
  • ✅ WordPress 网站访问慢、报错或插件冲突
  • ✅ Nginx / MySQL / Redis / Linux 服务器异常
  • ✅ CDN / Cloudflare / DNS / HTTPS 配置问题
  • ✅ 需要长期远程技术支持或兼职维护

更多介绍请查看:关于我 & 合作

微信:13980074657
邮箱:shuijingwanwq@gmail.com
Telegram:@shuijingwan
GitHub:https://github.com/shuijingwan

评论

2 条对“在 PHP 7.4 中,基于语义化版本的目录名称,从低到高逐一执行目录中的脚本文件”的回复

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理