├── server ├── application │ ├── .htaccess │ ├── index │ │ ├── view │ │ │ └── index │ │ │ │ └── index.html │ │ ├── controller │ │ │ ├── Bazi.php │ │ │ └── Index.php │ │ └── service │ │ │ ├── MangPai.php │ │ │ ├── Stars.php │ │ │ └── Paipan.php │ ├── command.php │ ├── provider.php │ ├── common.php │ └── tags.php ├── extend │ └── .gitignore ├── runtime │ └── .gitignore ├── public │ ├── static │ │ └── .gitignore │ ├── robots.txt │ ├── favicon.ico │ ├── .htaccess │ ├── index.html │ ├── router.php │ ├── index.php │ └── front │ │ └── test │ │ ├── suanming.html │ │ └── paipan.html ├── .gitignore ├── composer.json ├── route │ └── route.php ├── think ├── config │ ├── trace.php │ ├── middleware.php │ ├── console.php │ ├── cache.php │ ├── session.php │ ├── log.php │ ├── cookie.php │ ├── template.php │ ├── database.php │ └── app.php ├── build.php ├── LICENSE.txt ├── .travis.yml ├── composer.lock ├── README.md └── CHANGELOG.md ├── README.en.md └── README.md /server/application/.htaccess: -------------------------------------------------------------------------------- 1 | deny from all -------------------------------------------------------------------------------- /server/extend/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /server/runtime/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /server/public/static/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /server/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /server/.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /.vscode 3 | /vendor 4 | *.log 5 | thinkphp 6 | .env 7 | .DS_Store 8 | -------------------------------------------------------------------------------- /server/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gclinux/efairy/HEAD/server/public/favicon.ico -------------------------------------------------------------------------------- /server/public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | Options +FollowSymlinks -Multiviews 3 | RewriteEngine On 4 | 5 | RewriteCond %{REQUEST_FILENAME} !-d 6 | RewriteCond %{REQUEST_FILENAME} !-f 7 | RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 8 | 9 | -------------------------------------------------------------------------------- /server/application/index/view/index/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 盼运网-在线算命,排盘,算命,免费算命,很准的算命,大师算命,八字,八字算命,婚姻,爱情,占卜,易学 6 | 7 | 8 | 在线排盘 9 | 10 | 11 | -------------------------------------------------------------------------------- /server/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 盼运网-在线算命,排盘,算命,免费算命,很准的算命,大师算命,八字,八字算命,婚姻,爱情,占卜,易学 6 | 7 | 8 | 在线排盘
9 | 在线算命 10 | 11 | 12 | -------------------------------------------------------------------------------- /server/application/command.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | return []; 13 | -------------------------------------------------------------------------------- /server/application/provider.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // 应用容器绑定定义 13 | return [ 14 | ]; 15 | -------------------------------------------------------------------------------- /server/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "topthink/think", 3 | "description": "the new thinkphp framework", 4 | "type": "project", 5 | "keywords": [ 6 | "framework", 7 | "thinkphp", 8 | "ORM" 9 | ], 10 | "homepage": "http://thinkphp.cn/", 11 | "license": "Apache-2.0", 12 | "authors": [ 13 | { 14 | "name": "liu21st", 15 | "email": "liu21st@gmail.com" 16 | } 17 | ], 18 | "require": { 19 | "php": ">=5.6.0", 20 | "topthink/framework": "5.1.*" 21 | }, 22 | "autoload": { 23 | "psr-4": { 24 | "app\\": "application" 25 | } 26 | }, 27 | "extra": { 28 | "think-path": "thinkphp" 29 | }, 30 | "config": { 31 | "preferred-install": "dist" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /server/public/router.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | // $Id$ 12 | 13 | if (is_file($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"])) { 14 | return false; 15 | } else { 16 | require __DIR__ . "/index.php"; 17 | } 18 | -------------------------------------------------------------------------------- /server/route/route.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | Route::get('think', function () { 13 | return 'hello,ThinkPHP5!'; 14 | }); 15 | 16 | Route::get('hello/:name', 'index/hello'); 17 | 18 | return [ 19 | 20 | ]; 21 | -------------------------------------------------------------------------------- /server/application/common.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // 应用公共文件 13 | function jsonReturn($data){ 14 | //效率更高 15 | \header('content:application/json;chartset=uft-8'); 16 | echo \json_encode($data); 17 | die(); 18 | } -------------------------------------------------------------------------------- /server/public/index.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // [ 应用入口文件 ] 13 | namespace think; 14 | 15 | // 加载基础文件 16 | require __DIR__ . '/../thinkphp/base.php'; 17 | 18 | // 支持事先使用静态方法设置Request对象和Config对象 19 | 20 | // 执行应用并响应 21 | Container::get('app')->run()->send(); 22 | -------------------------------------------------------------------------------- /server/think: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | 11 | // +---------------------------------------------------------------------- 12 | 13 | namespace think; 14 | 15 | // 加载基础文件 16 | require __DIR__ . '/thinkphp/base.php'; 17 | 18 | // 应用初始化 19 | Container::get('app')->path(__DIR__ . '/application/')->initialize(); 20 | 21 | // 控制台初始化 22 | Console::init(); -------------------------------------------------------------------------------- /server/config/trace.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // +---------------------------------------------------------------------- 13 | // | Trace设置 开启 app_trace 后 有效 14 | // +---------------------------------------------------------------------- 15 | return [ 16 | // 内置Html Console 支持扩展 17 | 'type' => 'Html', 18 | ]; 19 | -------------------------------------------------------------------------------- /server/config/middleware.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // +---------------------------------------------------------------------- 13 | // | 中间件配置 14 | // +---------------------------------------------------------------------- 15 | return [ 16 | // 默认中间件命名空间 17 | 'default_namespace' => 'app\\http\\middleware\\', 18 | ]; 19 | -------------------------------------------------------------------------------- /README.en.md: -------------------------------------------------------------------------------- 1 | # Efairy 2 | 3 | #### Description 4 | 算命 5 | 6 | #### Software Architecture 7 | Software architecture description 8 | 9 | #### Installation 10 | 11 | 1. xxxx 12 | 2. xxxx 13 | 3. xxxx 14 | 15 | #### Instructions 16 | 17 | 1. xxxx 18 | 2. xxxx 19 | 3. xxxx 20 | 21 | #### Contribution 22 | 23 | 1. Fork the repository 24 | 2. Create Feat_xxx branch 25 | 3. Commit your code 26 | 4. Create Pull Request 27 | 28 | 29 | #### Gitee Feature 30 | 31 | 1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md 32 | 2. Gitee blog [blog.gitee.com](https://blog.gitee.com) 33 | 3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) 34 | 4. The most valuable open source project [GVP](https://gitee.com/gvp) 35 | 5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) 36 | 6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) -------------------------------------------------------------------------------- /server/config/console.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // +---------------------------------------------------------------------- 13 | // | 控制台配置 14 | // +---------------------------------------------------------------------- 15 | return [ 16 | 'name' => 'Think Console', 17 | 'version' => '0.1', 18 | 'user' => null, 19 | 'auto_path' => env('app_path') . 'command' . DIRECTORY_SEPARATOR, 20 | ]; 21 | -------------------------------------------------------------------------------- /server/application/tags.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // 应用行为扩展定义文件 13 | return [ 14 | // 应用初始化 15 | 'app_init' => [], 16 | // 应用开始 17 | 'app_begin' => [], 18 | // 模块初始化 19 | 'module_init' => [], 20 | // 操作开始执行 21 | 'action_begin' => [], 22 | // 视图内容过滤 23 | 'view_filter' => [], 24 | // 日志写入 25 | 'log_write' => [], 26 | // 应用结束 27 | 'app_end' => [], 28 | ]; 29 | -------------------------------------------------------------------------------- /server/config/cache.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // +---------------------------------------------------------------------- 13 | // | 缓存设置 14 | // +---------------------------------------------------------------------- 15 | 16 | return [ 17 | // 驱动方式 18 | 'type' => 'File', 19 | // 缓存保存目录 20 | 'path' => '', 21 | // 缓存前缀 22 | 'prefix' => '', 23 | // 缓存有效期 0表示永久缓存 24 | 'expire' => 0, 25 | ]; 26 | -------------------------------------------------------------------------------- /server/build.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | return [ 13 | // 生成应用公共文件 14 | '__file__' => ['common.php'], 15 | 16 | // 定义demo模块的自动生成 (按照实际定义的文件名生成) 17 | 'demo' => [ 18 | '__file__' => ['common.php'], 19 | '__dir__' => ['behavior', 'controller', 'model', 'view'], 20 | 'controller' => ['Index', 'Test', 'UserType'], 21 | 'model' => ['User', 'UserType'], 22 | 'view' => ['index/index'], 23 | ], 24 | 25 | // 其他更多的模块定义 26 | ]; 27 | -------------------------------------------------------------------------------- /server/config/session.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // +---------------------------------------------------------------------- 13 | // | 会话设置 14 | // +---------------------------------------------------------------------- 15 | 16 | return [ 17 | 'id' => '', 18 | // SESSION_ID的提交变量,解决flash上传跨域 19 | 'var_session_id' => '', 20 | // SESSION 前缀 21 | 'prefix' => 'think', 22 | // 驱动方式 支持redis memcache memcached 23 | 'type' => '', 24 | // 是否自动开启 SESSION 25 | 'auto_start' => true, 26 | ]; 27 | -------------------------------------------------------------------------------- /server/config/log.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // +---------------------------------------------------------------------- 13 | // | 日志设置 14 | // +---------------------------------------------------------------------- 15 | return [ 16 | // 日志记录方式,内置 file socket 支持扩展 17 | 'type' => 'File', 18 | // 日志保存目录 19 | 'path' => '', 20 | // 日志记录级别 21 | 'level' => [], 22 | // 单文件日志写入 23 | 'single' => false, 24 | // 独立日志级别 25 | 'apart_level' => [], 26 | // 最大日志文件数量 27 | 'max_files' => 0, 28 | // 是否关闭日志写入 29 | 'close' => false, 30 | ]; 31 | -------------------------------------------------------------------------------- /server/config/cookie.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // +---------------------------------------------------------------------- 13 | // | Cookie设置 14 | // +---------------------------------------------------------------------- 15 | return [ 16 | // cookie 名称前缀 17 | 'prefix' => '', 18 | // cookie 保存时间 19 | 'expire' => 0, 20 | // cookie 保存路径 21 | 'path' => '/', 22 | // cookie 有效域名 23 | 'domain' => '', 24 | // cookie 启用安全传输 25 | 'secure' => false, 26 | // httponly设置 27 | 'httponly' => '', 28 | // 是否使用 setcookie 29 | 'setcookie' => true, 30 | ]; 31 | -------------------------------------------------------------------------------- /server/config/template.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // +---------------------------------------------------------------------- 13 | // | 模板设置 14 | // +---------------------------------------------------------------------- 15 | 16 | return [ 17 | // 模板引擎类型 支持 php think 支持扩展 18 | 'type' => 'Think', 19 | // 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法 20 | 'auto_rule' => 1, 21 | // 模板路径 22 | 'view_path' => '', 23 | // 模板后缀 24 | 'view_suffix' => 'html', 25 | // 模板文件名分隔符 26 | 'view_depr' => DIRECTORY_SEPARATOR, 27 | // 模板引擎普通标签开始标记 28 | 'tpl_begin' => '{', 29 | // 模板引擎普通标签结束标记 30 | 'tpl_end' => '}', 31 | // 标签库标签开始标记 32 | 'taglib_begin' => '{', 33 | // 标签库标签结束标记 34 | 'taglib_end' => '}', 35 | ]; 36 | -------------------------------------------------------------------------------- /server/LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | ThinkPHP遵循Apache2开源协议发布,并提供免费使用。 3 | 版权所有Copyright © 2006-2018 by ThinkPHP (http://thinkphp.cn) 4 | All rights reserved。 5 | ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。 6 | 7 | Apache Licence是著名的非盈利开源组织Apache采用的协议。 8 | 该协议和BSD类似,鼓励代码共享和尊重原作者的著作权, 9 | 允许代码修改,再作为开源或商业软件发布。需要满足 10 | 的条件: 11 | 1. 需要给代码的用户一份Apache Licence ; 12 | 2. 如果你修改了代码,需要在被修改的文件中说明; 13 | 3. 在延伸的代码中(修改和有源代码衍生的代码中)需要 14 | 带有原来代码中的协议,商标,专利声明和其他原来作者规 15 | 定需要包含的说明; 16 | 4. 如果再发布的产品中包含一个Notice文件,则在Notice文 17 | 件中需要带有本协议内容。你可以在Notice中增加自己的 18 | 许可,但不可以表现为对Apache Licence构成更改。 19 | 具体的协议参考:http://www.apache.org/licenses/LICENSE-2.0 20 | 21 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 24 | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 25 | COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 29 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 31 | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32 | POSSIBILITY OF SUCH DAMAGE. 33 | -------------------------------------------------------------------------------- /server/config/database.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | return [ 13 | // 数据库类型 14 | 'type' => 'mysql', 15 | // 服务器地址 16 | 'hostname' => '127.0.0.1', 17 | // 数据库名 18 | 'database' => '', 19 | // 用户名 20 | 'username' => 'root', 21 | // 密码 22 | 'password' => '', 23 | // 端口 24 | 'hostport' => '', 25 | // 连接dsn 26 | 'dsn' => '', 27 | // 数据库连接参数 28 | 'params' => [], 29 | // 数据库编码默认采用utf8 30 | 'charset' => 'utf8', 31 | // 数据库表前缀 32 | 'prefix' => '', 33 | // 数据库调试模式 34 | 'debug' => true, 35 | // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 36 | 'deploy' => 0, 37 | // 数据库读写是否分离 主从式有效 38 | 'rw_separate' => false, 39 | // 读写分离后 主服务器数量 40 | 'master_num' => 1, 41 | // 指定从服务器序号 42 | 'slave_no' => '', 43 | // 自动读取主库数据 44 | 'read_master' => false, 45 | // 是否严格检查字段是否存在 46 | 'fields_strict' => true, 47 | // 数据集返回类型 48 | 'resultset_type' => 'array', 49 | // 自动写入时间戳字段 50 | 'auto_timestamp' => false, 51 | // 时间字段取出后的默认时间格式 52 | 'datetime_format' => 'Y-m-d H:i:s', 53 | // 是否需要进行SQL性能分析 54 | 'sql_explain' => false, 55 | // Builder类 56 | 'builder' => '', 57 | // Query类 58 | 'query' => '\\think\\db\\Query', 59 | // 是否需要断线重连 60 | 'break_reconnect' => false, 61 | // 断线标识字符串 62 | 'break_match_str' => [], 63 | ]; 64 | -------------------------------------------------------------------------------- /server/.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | 3 | language: php 4 | 5 | branches: 6 | only: 7 | - stable 8 | 9 | cache: 10 | directories: 11 | - $HOME/.composer/cache 12 | 13 | before_install: 14 | - composer self-update 15 | 16 | install: 17 | - composer install --no-dev --no-interaction --ignore-platform-reqs 18 | - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip . 19 | - composer require --update-no-dev --no-interaction "topthink/think-image:^1.0" 20 | - composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0" 21 | - composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0" 22 | - composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0" 23 | - composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0" 24 | - composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0" 25 | - composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0" 26 | - composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0" 27 | - composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0" 28 | - zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip . 29 | 30 | script: 31 | - php think unit 32 | 33 | deploy: 34 | provider: releases 35 | api_key: 36 | secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw= 37 | file: 38 | - ThinkPHP_Core.zip 39 | - ThinkPHP_Full.zip 40 | skip_cleanup: true 41 | on: 42 | tags: true 43 | -------------------------------------------------------------------------------- /server/public/front/test/suanming.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 八字算命-八字在线排盘-八字在线起卦-四柱在线排盘-四柱在线起卦-盼运溪在线排盘系统 6 | 7 | 8 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 盼运网八字排盘系统V0.1内部测试版本 25 | 26 |
27 | 28 | 29 | 30 | 36 | 37 | 38 | 39 | 40 | 提交 41 | 42 | 43 | 44 | 45 | 46 | 47 |
48 | 结果: 49 |
50 |
51 | {{o}} 52 |
53 |
54 | 55 |
56 |
57 |
58 |
59 |
60 | 61 | 62 | 63 | 64 | 65 | 91 | -------------------------------------------------------------------------------- /server/application/index/controller/Bazi.php: -------------------------------------------------------------------------------- 1 | GetInfo($sex, $yy, $mm, $dd, $hh, $ii, 0); 19 | jsonReturn(['pan'=>$info]); 20 | } 21 | 22 | function api2($sex,$time){ 23 | $time = strtotime($time); 24 | $yy = date('Y',$time); 25 | $mm = date('m',$time); 26 | $dd = date('d',$time); 27 | $hh = date('H',$time); 28 | $ii = date('i',$time); 29 | $p = new MangPai(); 30 | $info = $p->GetInfo($sex, $yy, $mm, $dd, $hh, $ii, 0); 31 | jsonReturn($info); 32 | } 33 | 34 | function test(){ 35 | $p = new Paipan(); 36 | $p->zwz = true; //分早晚子时 37 | $info = $p->GetInfo(0, 1989, 2, 4, 4, 59, 0); 38 | dump($info); 39 | } 40 | function test2(){ 41 | $p = new Paipan(); 42 | $p->zwz = true; //分早晚子时 43 | $info = $p->GetInfo(0, 1989, 2, 4, 2, 59, 0); 44 | dump($info); 45 | } 46 | function test22(){ 47 | $p = new MangPai(); 48 | $p->zwz = true; //分早晚子时 49 | $info = $p->GetInfo(0, 1989, 2, 4, 2, 30, 0); 50 | dump($info); 51 | } 52 | 53 | function test3(){ 54 | $p = new Mangpai(); 55 | $p->zwz = true; //分早晚子时 56 | $info = $p->GetInfo(1, 2017, 12, 21, 13,30, 0); 57 | dump($info); 58 | } 59 | 60 | function test4(){ 61 | $p = new MangPai(); 62 | $p->zwz = true; //分早晚子时 63 | $info = $p->GetInfo(0, 1989, 2, 4, 2, 30, 0); 64 | //dump($info); 65 | } 66 | 67 | function test5(){ 68 | //1994-10-31 69 | // $this->test3(); 70 | $p = new MangPai(); 71 | // $p->zwz = true; //分早晚子时 72 | $info = $p->GetInfo(1, 1994, 10, 31, 13,30, 0); 73 | dump($info); 74 | } 75 | 76 | function test6(){ 77 | //1990年5月27,下午,6点左右出生,排行老大,独子 78 | $p = new MangPai(); 79 | $info = $p->GetInfo(1, 1990, 5, 27, 18,10, 0); 80 | 81 | } 82 | 83 | function test7(){ 84 | //guo郭家大少 85 | // $this->test3(); 86 | $p = new MangPai(); 87 | // $p->zwz = true; //分早晚子时 88 | $info = $p->GetInfo(0, 2019, 5, 12, 0,45, 0); 89 | dump($info); 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /server/application/index/controller/Index.php: -------------------------------------------------------------------------------- 1 | fetch(); 9 | } 10 | 11 | public function hello($name = 'ThinkPHP5') 12 | { 13 | return 'hello,' . $name; 14 | } 15 | 16 | function getJieQi() 17 | { 18 | header("Content-Type:application/json;charset=utf-8"); 19 | $_year=input("get.year"); 20 | $month=input("get.month"); 21 | $day=input("get.day"); 22 | $year = substr($_year,-2)+0; 23 | $coefficient = array( 24 | array(5.4055,2019,-1),//小寒 25 | array(20.12,2082,1),//大寒 26 | array(3.87),//立春 27 | array(18.74,2026,-1),//雨水 28 | array(5.63),//惊蛰 29 | array(20.646,2084,1),//春分 30 | array(4.81),//清明 31 | array(20.1),//谷雨 32 | array(5.52,1911,1),//立夏 33 | array(21.04,2008,1),//小满 34 | array(5.678,1902,1),//芒种 35 | array(21.37,1928,1),//夏至 36 | array(7.108,2016,1),//小暑 37 | array(22.83,1922,1),//大暑 38 | array(7.5,2002,1),//立秋 39 | array(23.13),//处暑 40 | array(7.646,1927,1),//白露 41 | array(23.042,1942,1),//秋分 42 | array(8.318),//寒露 43 | array(23.438,2089,1),//霜降 44 | array(7.438,2089,1),//立冬 45 | array(22.36,1978,1),//小雪 46 | array(7.18,1954,1),//大雪 47 | array(21.94,2021,-1)//冬至 48 | ); 49 | $term_name = array( 50 | "小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨", 51 | "立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑", 52 | "白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"); 53 | 54 | $idx1 = ($month-1)*2; 55 | $_leap_value = floor(($year-1)/4); 56 | $day1 = floor($year*0.2422+$coefficient[$idx1][0])-$_leap_value; 57 | if(isset($coefficient[$idx1][1])&&$coefficient[$idx1][1]==$_year) $day1 += $coefficient[$idx1][2]; 58 | $day2 = floor($year*0.2422+$coefficient[$idx1+1][0])-$_leap_value; 59 | if(isset($coefficient[$idx1+1][1])&&$coefficient[$idx1+1][1]==$_year) $day1 += $coefficient[$idx1+1][2]; 60 | 61 | //echo __FILE__.'->'.__LINE__.' $day1='.$day1,',$day2='.$day2.'
'.chr(10); 62 | $data=array(); 63 | if($day<$day1){ 64 | $data['name1']=$term_name[$idx1-1]; 65 | $data['name2']=$term_name[$idx1-1].'后'; 66 | }else if($day==$day1){ 67 | $data['name1']=$term_name[$idx1]; 68 | $data['name2']=$term_name[$idx1]; 69 | }else if($day>$day1 && $day<$day2){ 70 | $data['name1']=$term_name[$idx1]; 71 | $data['name2']=$term_name[$idx1].'后'; 72 | }else if($day==$day2){ 73 | $data['name1']=$term_name[$idx1+1]; 74 | $data['name2']=$term_name[$idx1+1]; 75 | }else if($day>$day2){ 76 | $data['name1']=$term_name[$idx1+1]; 77 | $data['name2']=$term_name[$idx1+1].'后'; 78 | } 79 | echo json_encode($data); 80 | } 81 | 82 | } 83 | -------------------------------------------------------------------------------- /server/composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "296bd8a1d28e39d56dcd80ce7be249f3", 8 | "packages": [ 9 | { 10 | "name": "topthink/framework", 11 | "version": "v5.1.35", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/top-think/framework.git", 15 | "reference": "c53c0c6132022a87e8ee9c4109939eaf9a8a7adb" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/top-think/framework/zipball/c53c0c6132022a87e8ee9c4109939eaf9a8a7adb", 20 | "reference": "c53c0c6132022a87e8ee9c4109939eaf9a8a7adb", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.6.0", 25 | "topthink/think-installer": "2.*" 26 | }, 27 | "require-dev": { 28 | "johnkary/phpunit-speedtrap": "^1.0", 29 | "mikey179/vfsstream": "~1.6", 30 | "phpdocumentor/reflection-docblock": "^2.0", 31 | "phploc/phploc": "2.*", 32 | "phpunit/phpunit": "^5.0|^6.0", 33 | "sebastian/phpcpd": "2.*", 34 | "squizlabs/php_codesniffer": "2.*" 35 | }, 36 | "type": "think-framework", 37 | "notification-url": "https://packagist.org/downloads/", 38 | "license": [ 39 | "Apache-2.0" 40 | ], 41 | "authors": [ 42 | { 43 | "name": "liu21st", 44 | "email": "liu21st@gmail.com" 45 | }, 46 | { 47 | "name": "yunwuxin", 48 | "email": "448901948@qq.com" 49 | } 50 | ], 51 | "description": "the new thinkphp framework", 52 | "homepage": "http://thinkphp.cn/", 53 | "keywords": [ 54 | "framework", 55 | "orm", 56 | "thinkphp" 57 | ], 58 | "time": "2019-03-03T00:44:44+00:00" 59 | }, 60 | { 61 | "name": "topthink/think-installer", 62 | "version": "v2.0.0", 63 | "source": { 64 | "type": "git", 65 | "url": "https://github.com/top-think/think-installer.git", 66 | "reference": "f5400a12c60e513911aef41fe443fa6920952675" 67 | }, 68 | "dist": { 69 | "type": "zip", 70 | "url": "https://api.github.com/repos/top-think/think-installer/zipball/f5400a12c60e513911aef41fe443fa6920952675", 71 | "reference": "f5400a12c60e513911aef41fe443fa6920952675", 72 | "shasum": "" 73 | }, 74 | "require": { 75 | "composer-plugin-api": "^1.0" 76 | }, 77 | "require-dev": { 78 | "composer/composer": "1.0.*@dev" 79 | }, 80 | "type": "composer-plugin", 81 | "extra": { 82 | "class": "think\\composer\\Plugin" 83 | }, 84 | "autoload": { 85 | "psr-4": { 86 | "think\\composer\\": "src" 87 | } 88 | }, 89 | "notification-url": "https://packagist.org/downloads/", 90 | "license": [ 91 | "Apache-2.0" 92 | ], 93 | "authors": [ 94 | { 95 | "name": "yunwuxin", 96 | "email": "448901948@qq.com" 97 | } 98 | ], 99 | "time": "2018-05-11T06:45:42+00:00" 100 | } 101 | ], 102 | "packages-dev": [], 103 | "aliases": [], 104 | "minimum-stability": "stable", 105 | "stability-flags": [], 106 | "prefer-stable": false, 107 | "prefer-lowest": false, 108 | "platform": { 109 | "php": ">=5.6.0" 110 | }, 111 | "platform-dev": [] 112 | } 113 | -------------------------------------------------------------------------------- /server/README.md: -------------------------------------------------------------------------------- 1 | ![](https://box.kancloud.cn/5a0aaa69a5ff42657b5c4715f3d49221) 2 | 3 | ThinkPHP 5.1(LTS版本) —— 12载初心,你值得信赖的PHP框架 4 | =============== 5 | 6 | [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/top-think/framework/badges/quality-score.png?b=5.1)](https://scrutinizer-ci.com/g/top-think/framework/?branch=5.1) 7 | [![Build Status](https://travis-ci.org/top-think/framework.svg?branch=master)](https://travis-ci.org/top-think/framework) 8 | [![Total Downloads](https://poser.pugx.org/topthink/framework/downloads)](https://packagist.org/packages/topthink/framework) 9 | [![Latest Stable Version](https://poser.pugx.org/topthink/framework/v/stable)](https://packagist.org/packages/topthink/framework) 10 | [![PHP Version](https://img.shields.io/badge/php-%3E%3D5.6-8892BF.svg)](http://www.php.net/) 11 | [![License](https://poser.pugx.org/topthink/framework/license)](https://packagist.org/packages/topthink/framework) 12 | 13 | ThinkPHP5.1对底层架构做了进一步的改进,减少依赖,其主要特性包括: 14 | 15 | + 采用容器统一管理对象 16 | + 支持Facade 17 | + 注解路由支持 18 | + 路由跨域请求支持 19 | + 配置和路由目录独立 20 | + 取消系统常量 21 | + 助手函数增强 22 | + 类库别名机制 23 | + 增加条件查询 24 | + 改进查询机制 25 | + 配置采用二级 26 | + 依赖注入完善 27 | + 支持`PSR-3`日志规范 28 | + 中间件支持(V5.1.6+) 29 | + Swoole/Workerman支持(V5.1.18+) 30 | 31 | 32 | > ThinkPHP5的运行环境要求PHP5.6以上。 33 | 34 | ## 安装 35 | 36 | 使用composer安装 37 | 38 | ~~~ 39 | composer create-project topthink/think tp 40 | ~~~ 41 | 42 | 启动服务 43 | 44 | ~~~ 45 | cd tp 46 | php think run 47 | ~~~ 48 | 49 | 然后就可以在浏览器中访问 50 | 51 | ~~~ 52 | http://localhost:8000 53 | ~~~ 54 | 55 | 更新框架 56 | ~~~ 57 | composer update topthink/framework 58 | ~~~ 59 | 60 | 61 | ## 在线手册 62 | 63 | + [完全开发手册](https://www.kancloud.cn/manual/thinkphp5_1/content) 64 | + [升级指导](https://www.kancloud.cn/manual/thinkphp5_1/354155) 65 | 66 | ## 目录结构 67 | 68 | 初始的目录结构如下: 69 | 70 | ~~~ 71 | www WEB部署目录(或者子目录) 72 | ├─application 应用目录 73 | │ ├─common 公共模块目录(可以更改) 74 | │ ├─module_name 模块目录 75 | │ │ ├─common.php 模块函数文件 76 | │ │ ├─controller 控制器目录 77 | │ │ ├─model 模型目录 78 | │ │ ├─view 视图目录 79 | │ │ └─ ... 更多类库目录 80 | │ │ 81 | │ ├─command.php 命令行定义文件 82 | │ ├─common.php 公共函数文件 83 | │ └─tags.php 应用行为扩展定义文件 84 | │ 85 | ├─config 应用配置目录 86 | │ ├─module_name 模块配置目录 87 | │ │ ├─database.php 数据库配置 88 | │ │ ├─cache 缓存配置 89 | │ │ └─ ... 90 | │ │ 91 | │ ├─app.php 应用配置 92 | │ ├─cache.php 缓存配置 93 | │ ├─cookie.php Cookie配置 94 | │ ├─database.php 数据库配置 95 | │ ├─log.php 日志配置 96 | │ ├─session.php Session配置 97 | │ ├─template.php 模板引擎配置 98 | │ └─trace.php Trace配置 99 | │ 100 | ├─route 路由定义目录 101 | │ ├─route.php 路由定义 102 | │ └─... 更多 103 | │ 104 | ├─public WEB目录(对外访问目录) 105 | │ ├─index.php 入口文件 106 | │ ├─router.php 快速测试文件 107 | │ └─.htaccess 用于apache的重写 108 | │ 109 | ├─thinkphp 框架系统目录 110 | │ ├─lang 语言文件目录 111 | │ ├─library 框架类库目录 112 | │ │ ├─think Think类库包目录 113 | │ │ └─traits 系统Trait目录 114 | │ │ 115 | │ ├─tpl 系统模板目录 116 | │ ├─base.php 基础定义文件 117 | │ ├─console.php 控制台入口文件 118 | │ ├─convention.php 框架惯例配置文件 119 | │ ├─helper.php 助手函数文件 120 | │ ├─phpunit.xml phpunit配置文件 121 | │ └─start.php 框架入口文件 122 | │ 123 | ├─extend 扩展类库目录 124 | ├─runtime 应用的运行时目录(可写,可定制) 125 | ├─vendor 第三方类库目录(Composer依赖库) 126 | ├─build.php 自动生成定义文件(参考) 127 | ├─composer.json composer 定义文件 128 | ├─LICENSE.txt 授权说明文件 129 | ├─README.md README 文件 130 | ├─think 命令行入口文件 131 | ~~~ 132 | 133 | > 可以使用php自带webserver快速测试 134 | > 切换到根目录后,启动命令:php think run 135 | 136 | ## 命名规范 137 | 138 | `ThinkPHP5`遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范: 139 | 140 | ### 目录和文件 141 | 142 | * 目录不强制规范,驼峰和小写+下划线模式均支持; 143 | * 类库、函数文件统一以`.php`为后缀; 144 | * 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致; 145 | * 类名和类文件名保持一致,统一采用驼峰法命名(首字母大写); 146 | 147 | ### 函数和类、属性命名 148 | 149 | * 类的命名采用驼峰法,并且首字母大写,例如 `User`、`UserType`,默认不需要添加后缀,例如`UserController`应该直接命名为`User`; 150 | * 函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 `get_client_ip`; 151 | * 方法的命名使用驼峰法,并且首字母小写,例如 `getUserName`; 152 | * 属性的命名使用驼峰法,并且首字母小写,例如 `tableName`、`instance`; 153 | * 以双下划线“__”打头的函数或方法作为魔法方法,例如 `__call` 和 `__autoload`; 154 | 155 | ### 常量和配置 156 | 157 | * 常量以大写字母和下划线命名,例如 `APP_PATH`和 `THINK_PATH`; 158 | * 配置参数以小写字母和下划线命名,例如 `url_route_on` 和`url_convert`; 159 | 160 | ### 数据表和字段 161 | 162 | * 数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 `think_user` 表和 `user_name`字段,不建议使用驼峰和中文作为数据表字段命名。 163 | 164 | ## 参与开发 165 | 166 | 请参阅 [ThinkPHP5 核心框架包](https://github.com/top-think/framework)。 167 | 168 | ## 版权信息 169 | 170 | ThinkPHP遵循Apache2开源协议发布,并提供免费使用。 171 | 172 | 本项目包含的第三方源码和二进制文件之版权信息另行标注。 173 | 174 | 版权所有Copyright © 2006-2018 by ThinkPHP (http://thinkphp.cn) 175 | 176 | All rights reserved。 177 | 178 | ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。 179 | 180 | 更多细节参阅 [LICENSE.txt](LICENSE.txt) 181 | -------------------------------------------------------------------------------- /server/config/app.php: -------------------------------------------------------------------------------- 1 | 10 | // +---------------------------------------------------------------------- 11 | 12 | // +---------------------------------------------------------------------- 13 | // | 应用设置 14 | // +---------------------------------------------------------------------- 15 | 16 | return [ 17 | // 应用名称 18 | 'app_name' => '', 19 | // 应用地址 20 | 'app_host' => '', 21 | // 应用调试模式 22 | 'app_debug' => true, 23 | // 应用Trace 24 | 'app_trace' => false, 25 | // 是否支持多模块 26 | 'app_multi_module' => true, 27 | // 入口自动绑定模块 28 | 'auto_bind_module' => false, 29 | // 注册的根命名空间 30 | 'root_namespace' => [], 31 | // 默认输出类型 32 | 'default_return_type' => 'html', 33 | // 默认AJAX 数据返回格式,可选json xml ... 34 | 'default_ajax_return' => 'json', 35 | // 默认JSONP格式返回的处理方法 36 | 'default_jsonp_handler' => 'jsonpReturn', 37 | // 默认JSONP处理方法 38 | 'var_jsonp_handler' => 'callback', 39 | // 默认时区 40 | 'default_timezone' => 'Asia/Shanghai', 41 | // 是否开启多语言 42 | 'lang_switch_on' => false, 43 | // 默认全局过滤方法 用逗号分隔多个 44 | 'default_filter' => '', 45 | // 默认语言 46 | 'default_lang' => 'zh-cn', 47 | // 应用类库后缀 48 | 'class_suffix' => false, 49 | // 控制器类后缀 50 | 'controller_suffix' => false, 51 | 52 | // +---------------------------------------------------------------------- 53 | // | 模块设置 54 | // +---------------------------------------------------------------------- 55 | 56 | // 默认模块名 57 | 'default_module' => 'index', 58 | // 禁止访问模块 59 | 'deny_module_list' => ['common'], 60 | // 默认控制器名 61 | 'default_controller' => 'Index', 62 | // 默认操作名 63 | 'default_action' => 'index', 64 | // 默认验证器 65 | 'default_validate' => '', 66 | // 默认的空模块名 67 | 'empty_module' => '', 68 | // 默认的空控制器名 69 | 'empty_controller' => 'Error', 70 | // 操作方法前缀 71 | 'use_action_prefix' => false, 72 | // 操作方法后缀 73 | 'action_suffix' => '', 74 | // 自动搜索控制器 75 | 'controller_auto_search' => false, 76 | 77 | // +---------------------------------------------------------------------- 78 | // | URL设置 79 | // +---------------------------------------------------------------------- 80 | 81 | // PATHINFO变量名 用于兼容模式 82 | 'var_pathinfo' => 's', 83 | // 兼容PATH_INFO获取 84 | 'pathinfo_fetch' => ['ORIG_PATH_INFO', 'REDIRECT_PATH_INFO', 'REDIRECT_URL'], 85 | // pathinfo分隔符 86 | 'pathinfo_depr' => '/', 87 | // HTTPS代理标识 88 | 'https_agent_name' => '', 89 | // IP代理获取标识 90 | 'http_agent_ip' => 'X-REAL-IP', 91 | // URL伪静态后缀 92 | 'url_html_suffix' => 'html', 93 | // URL普通方式参数 用于自动生成 94 | 'url_common_param' => false, 95 | // URL参数方式 0 按名称成对解析 1 按顺序解析 96 | 'url_param_type' => 0, 97 | // 是否开启路由延迟解析 98 | 'url_lazy_route' => false, 99 | // 是否强制使用路由 100 | 'url_route_must' => false, 101 | // 合并路由规则 102 | 'route_rule_merge' => false, 103 | // 路由是否完全匹配 104 | 'route_complete_match' => false, 105 | // 使用注解路由 106 | 'route_annotation' => false, 107 | // 域名根,如thinkphp.cn 108 | 'url_domain_root' => '', 109 | // 是否自动转换URL中的控制器和操作名 110 | 'url_convert' => true, 111 | // 默认的访问控制器层 112 | 'url_controller_layer' => 'controller', 113 | // 表单请求类型伪装变量 114 | 'var_method' => '_method', 115 | // 表单ajax伪装变量 116 | 'var_ajax' => '_ajax', 117 | // 表单pjax伪装变量 118 | 'var_pjax' => '_pjax', 119 | // 是否开启请求缓存 true自动缓存 支持设置请求缓存规则 120 | 'request_cache' => false, 121 | // 请求缓存有效期 122 | 'request_cache_expire' => null, 123 | // 全局请求缓存排除规则 124 | 'request_cache_except' => [], 125 | // 是否开启路由缓存 126 | 'route_check_cache' => false, 127 | // 路由缓存的Key自定义设置(闭包),默认为当前URL和请求类型的md5 128 | 'route_check_cache_key' => '', 129 | // 路由缓存类型及参数 130 | 'route_cache_option' => [], 131 | 132 | // 默认跳转页面对应的模板文件 133 | 'dispatch_success_tmpl' => Env::get('think_path') . 'tpl/dispatch_jump.tpl', 134 | 'dispatch_error_tmpl' => Env::get('think_path') . 'tpl/dispatch_jump.tpl', 135 | 136 | // 异常页面的模板文件 137 | 'exception_tmpl' => Env::get('think_path') . 'tpl/think_exception.tpl', 138 | 139 | // 错误显示信息,非调试模式有效 140 | 'error_message' => '页面错误!请稍后再试~', 141 | // 显示错误信息 142 | 'show_error_msg' => false, 143 | // 异常处理handle类 留空使用 \think\exception\Handle 144 | 'exception_handle' => '', 145 | 146 | ]; 147 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Efairy 2 | 3 | #### 介绍 4 | 5 | 基于thinkphp的算命网站核心演示 6 | 演示:http://www.panyunxi.com/ 7 | 8 | #### 软件架构 9 | 环境要求: 10 | thinkphp5.1 11 | php7.0以上 12 | composer 13 | 14 | #### 安装教程 15 | 16 | 0. git clone 本仓库 17 | 1. composer install 18 | 2. 服务器指向 public目录 19 | 20 | 21 | 22 | #### 参与贡献 23 | 24 | 1. Fork 本仓库 25 | 2. 新建 Feat_xxx 分支 26 | 3. 提交代码 27 | 4. 新建 Pull Request 28 | 29 | 30 | 31 | # 文档 32 | 33 | 本程序主要是对算命核心的一个演示,核心提供下列功能. 34 | 35 | 1.精确到秒的节气识别 36 | 37 | 2.新历的八字排盘运算 38 | 39 | 3.十神运算 40 | 41 | 4.十二长生运算 42 | 43 | 5.五行生旺运算 44 | 45 | 6.常用星煞运算 46 | 47 | 7.提供合,生,克,三合,半合,对冲,刑穿的检测方法 48 | 49 | 50 | 51 | 为帮助您看懂代码,您先阅读下面资料,并熟悉五行及易经的基本内容.推荐先阅读<四柱预测>入门的读物 52 | 53 | ## 数字化的传统表达 54 | 55 | 大部分情况下,程序在表达上使用数字替代天干地支和五行. 56 | 57 | ### 五行 58 | 59 | 五行的顺序为 木火土金水,程序上用0到4表示,分别为 60 | 61 | 0-木,1-火,2-土,3-金,4-火 62 | 63 | ### 天干与地支 64 | 65 | 天干 : '甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸',分别按顺序用0到9表示 66 | 67 | 地支:'子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥' 分别按顺序用0到11表示,生肖与之一致 68 | 69 | 12长生:"生", "沐", "冠", "临", "旺", "衰", "病", "死", "墓", "绝","胎", "养" 分别用0到11表示 70 | 71 | 72 | 73 | ### 十神 74 | 75 | 与上面不同 十神使用二维数组成对表示 76 | 77 | 数组如下: 78 | 79 | [['比', '劫'], ['食', '伤'], ['财', '才'],[ '杀', '官'], ['枭', '印']] 80 | 81 | 在记录表达上一般情况只记录索引, 82 | 83 | 例如比,记录索引为 [0,0],才记录为[2,0],官表示为[3,1]; 84 | 85 | 86 | 87 | 大部分情况下,调用 Stars::getInfo 方法,即可. 88 | 89 | 90 | 91 | 92 | 93 | 方法: getInfo($gd, $yy, $mm, $dd, $hh, $mt=0, $ss=0){ 94 | 95 | 参数说明: 96 | 97 | \* @param int $gd 0男1女 98 | 99 | \* @param int $yy 100 | 101 | \* @param int $mm 102 | 103 | \* @param int $dd 104 | 105 | \* @param int $hh 时间(0-23) 106 | 107 | \* @param int $mt 分钟数(0-59),在跨节的时辰上会需要,有的排盘忽略了跨节 108 | 109 | \* @param int $ss 秒数(0-59) 110 | 111 | \* @return array 112 | 113 | 114 | 115 | 返回数组说明: 116 | ``` 117 | { 118 | sex: 性别,0为男,1为女, 119 | tg: [//天干 120 | 年天干索引, 121 | 月天干索引, 122 | 日天干索引, 123 | 时天干索引 124 | ], 125 | dz: [//地支 126 | 年地支索引, 127 | 月地支索引, 128 | 日地支索引, 129 | 时地支索引 130 | ], 131 | bazi: [//八字的文字表述,对应上面 132 | [ 133 | "戊", 134 | "辰", 135 | ], 136 | [ 137 | ], 138 | ... 139 | ], 140 | sc: {//时辰分段,盲派可能用到 把时辰分为3段, 141 | index: [ 142 | 1,//时辰索引 143 | 2,//分段索引,0-头,1-中,2-尾 144 | ], 145 | char: "丑时尾", 146 | }, 147 | dz_cg: [ //地支藏干,分别是年,月,日,时的藏干 148 | { 149 | index: [ //索引 150 | 4, 151 | 1, 152 | 9, 153 | ], 154 | char: [ //索引对应的字符 155 | "戊", 156 | "乙", 157 | "癸", 158 | ], 159 | }, 160 | { 161 | index: [ 162 | x //屏蔽了 163 | x 164 | x 165 | ], 166 | char: [ 167 | "x", 168 | "x", 169 | "x", 170 | ], 171 | }, 172 | { 173 | index: [ 174 | x //屏蔽了 175 | x 176 | x 177 | ], 178 | char: [ 179 | "x", 180 | "x", 181 | "x", 182 | ], 183 | }, 184 | { 185 | index: [ 186 | x //屏蔽了 187 | x 188 | x 189 | ], 190 | char: [ 191 | "x", 192 | "x", 193 | "x", 194 | ], 195 | }, 196 | ], 197 | na_yin: [//4柱的纳音,对应年,月,日,时 198 | [ 199 | "大林木", 200 | 0,//纳音属性,0为木,1为火,如此类推 201 | ], 202 | ...//其余3个成员,一共4个成员 203 | ], 204 | xw: {//空亡的地支,总会有两个地支空的 205 | index: [ 206 | 4, 207 | 5, 208 | ], 209 | char: "辰巳", 210 | }, 211 | gong: { 宫 212 | index: [ 213 | 1, 214 | 3, 215 | ], 216 | char: "乙卯", 217 | }, 218 | tg_cg_god: [ 天干的十神,索引表示参考文档前面内容 219 | { 220 | index: [ 221 | 2, 222 | 1, 223 | ], 224 | char: "才", 225 | }, 226 | ....//其他3个 227 | ], 228 | dz_main_god: [//地支的十神 229 | [],[],[],[] 230 | ], 231 | day_cs: [//日游走4柱的长生,能让你了解日的能力影响情况 232 | { 233 | index: 2, 234 | char: "冠", 235 | }, 236 | { 237 | index: 5, 238 | char: "衰", 239 | }, 240 | { 241 | index: 11, 242 | char: "养", 243 | }, 244 | { 245 | index: 5, 246 | char: "衰", 247 | }, 248 | ], 249 | year_cs: [ 250 | { 251 | ... 252 | }, 253 | { 254 | ... 255 | }, 256 | ... 257 | ], 258 | big_tg: [ //大运的天干 259 | 2, 260 | 3, 261 | 4, 262 | 5, 263 | 6, 264 | 7, 265 | 8, 266 | 9, 267 | 0, 268 | 1, 269 | 2, 270 | 3, 271 | ], 272 | big_dz: [ //大运的地支 273 | 2, 274 | 3, 275 | 4, 276 | 5, 277 | 6, 278 | 7, 279 | 8, 280 | 9, 281 | 10, 282 | 11, 283 | 0, 284 | 1, 285 | ], 286 | start_desc: "X年X月X天起运",//起运时间描述 287 | start_time: [//起运具体时间点 288 | 1989,//年 289 | xx,//月 290 | xx,//日 291 | 2,//时 292 | 0,//分 293 | 24,//苗 294 | ], 295 | years: [ ], 296 | big: [//大运的传统字符表示 297 | "丙寅", 298 | "丁卯", 299 | "戊辰", 300 | ... 301 | ], 302 | big_cs: [//大运的长生情况 303 | { 304 | index: 4, 305 | char: "旺", 306 | }, 307 | ...//忽略 308 | ], 309 | big_god: [ 310 | //大运的十神 311 | { 312 | index: [ 313 | 1, 314 | 1, 315 | ], 316 | char: "伤", 317 | }, 318 | ...省略 319 | ], 320 | big_start_time: [ 321 | [//大运时间卡点 322 | 年, 323 | 月, 324 | 日, 325 | 时, 326 | 分, 327 | 秒 328 | ], 329 | [ 330 | 1999, 331 | 2, 332 | 11, 333 | 2, 334 | 3, 335 | 24, 336 | ], 337 | ... 338 | ], 339 | xz: "水瓶座",//星座 340 | sx: "龙",//生肖 341 | years_info: [ 342 | //大运的卡点年资料 343 | { 344 | year: 1989,//年 345 | index: [ 346 | 5,//年的天干 347 | 5,//年的地支 348 | ], 349 | char: "己巳",//传统表达 350 | cg: [ //地支藏干 351 | 2, 352 | 4, 353 | 6, 354 | ], 355 | cs: {//那年的长生情况 356 | index: 1, 357 | char: "沐", 358 | }, 359 | tg_god: {//年份对应的十神 360 | index: [ 361 | 2, 362 | 0, 363 | ], 364 | char: "财", 365 | }, 366 | dz_god: [//地支的十神 367 | { 368 | index: [ 369 | 2, 370 | 0, 371 | ], 372 | char: "财", 373 | }, 374 | { 375 | index: [ 376 | 4, 377 | 0, 378 | ], 379 | char: "枭", 380 | }, 381 | ... 382 | ], 383 | []...//多个类推 384 | ], 385 | star: [//星煞 总体4个对象,对应4柱 386 | { 387 | 0: ["kongWang","空亡",], 388 | 2: ["taiJi","太极",],//星煞索引:[唯一名,传统表达名] 389 | }, 390 | {月} 391 | ,{日} 392 | ,{时} 393 | ], 394 | }, 395 | ], 396 | } 397 | 398 | ``` 399 | -------------------------------------------------------------------------------- /server/public/front/test/paipan.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 八字排盘-八字在线排盘-八字在线起卦-四柱在线排盘-四柱在线起卦-盼运溪在线排盘系统 6 | 7 | 8 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 盼运网八字排盘系统V0.1内部测试版本 25 | 26 |
27 | 28 | 29 | 30 | 36 | 37 | 38 | 39 | 40 | 提交 41 | 42 | 43 | 44 | 45 | 46 | 47 |
48 | 命盘信息(备注:才为正财,财为偏财) 49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
58 | 59 |
60 |
61 | 62 | 63 | 64 |
65 | 起运:{{rs.pan.start_desc}} 66 |
67 | 大运 68 |
69 | 70 | 71 | 72 | 73 |
74 |
75 |
76 |
77 |
78 | 79 | 80 | 81 | 82 | 83 | 161 | -------------------------------------------------------------------------------- /server/application/index/service/MangPai.php: -------------------------------------------------------------------------------- 1 | pan = new Paipan; 10 | } 11 | /** 12 | * 用分数来判断五行平衡,天干阳加1,阴加0.5,地支+1,藏干阳+0.5,阴+0.25,三合+1,半合加0.5,季节+0.3 13 | */ 14 | private function wuXingPingHeng($info){ 15 | $tg = $info['tg']; 16 | $dz = $info['dz']; 17 | $wx_fen = [0.0,0.0,0.0,0.0,0.0];//木火土金水得分 18 | for($i=0;$i<4;$i++){ 19 | $tg_wx = $this->pan->GetTgWx($tg[$i]); 20 | if($tg[$i]%2 == 0){ 21 | $wx_fen[$tg_wx]++; 22 | }else{ 23 | $wx_fen[$tg_wx] += 0.5; 24 | } 25 | $dz_wx = $this->pan->dzwx[$dz[$i]]; 26 | if($dz[$i]%2 == 0 ){ 27 | $wx_fen[$tg_wx]++; 28 | }else{ 29 | $wx_fen[$tg_wx] += 0.5; 30 | } 31 | 32 | if(in_array($dz[$i],[0,3,6,9])){ 33 | $sanhe = $this->pan->getSanHe($dz[$i]); 34 | for($j=0;$j>4;$j++){ 35 | if($i==$j){ 36 | continue; 37 | } 38 | if(in_array($dz[$j],[$sanhe['sanhe'][1],$sanhe['sanhe'][2]])){ 39 | $wx_fen[$sanhe['ju']]+=0.5; 40 | } 41 | } 42 | //if(in_array()) 43 | } 44 | 45 | $dzcg = $this->pan->dzcg[$dz[$i]]; 46 | foreach($dzcg as $cg){ 47 | $tg_wx = $this->pan->GetTgWx($cg); 48 | if($cg%2 == 0){ 49 | $wx_fen[$tg_wx] += 0.5; 50 | }else{ 51 | $wx_fen[$tg_wx] += 0.25; 52 | } 53 | } 54 | } 55 | //季节中蕴含的五行 56 | // if(in_array($dz[1],[2,3,4])){ 57 | // $wx_fen[0]+=0.3; 58 | //}elseif(in_array($dz[1],[5,6,7])){ 59 | // $wx_fen[1]+=0.3; 60 | //}elseif(in_array($dz[1],[8,9,10])){ 61 | // $wx_fen[3]+=0.3; 62 | //}elseif(in_array($dz[1],[11,0,1])){ 63 | // $wx_fen[4]+=0.3; 64 | //} 65 | $bianbang=[ 66 | '木,艹,禾', 67 | '日,火,灬,光', 68 | '土,玉,王,月', 69 | '金,钅', 70 | '水,氵' 71 | ]; 72 | $this->des[]="此人五行得分:木{$wx_fen[0]},火{$wx_fen[1]},土{$wx_fen[2]},金{$wx_fen[3]},水{$wx_fen[4]}"; 73 | $max = array_search(max($wx_fen),$wx_fen); 74 | $min = array_search(min($wx_fen),$wx_fen); 75 | $this->des[]="其中".$this->pan->cwx[$min]."最少,建议改名时候尽量考虑{$bianbang[$min]}的边旁的字.并且你会发现名字中带有这些边旁的人会对你比较好."; 76 | $this->des[]="其中".$this->pan->cwx[$max]."最多,建议改名时候尽量避开{$bianbang[$max]}的边旁的字."; 77 | // dump($wx_fen); 78 | } 79 | 80 | /** 81 | * 判断兄弟姐妹总数,根据盲派的口诀得来,部分命格需要除以二,但我资料有限,不知哪些状况需要除以2 82 | * @param array $info 排盘结果信息 83 | * 84 | */ 85 | private function getBroSisNum($info){ 86 | $tg_god = $info['tg_cg_god']; 87 | $dz_cg_god = $info['dz_cg_god']; 88 | //找出所有比劫和印的数量 89 | $yin = $bi = 0; 90 | for($i=0;$i<4;$i++){ 91 | if($tg_god[$i]['index'][0]==0){ 92 | $bi++; 93 | }elseif($tg_god[$i]['index'][0] == 4){ 94 | $yin++; 95 | } 96 | foreach($dz_cg_god[$i] as $j=>&$dz_god){ 97 | if($dz_god['index'][0] == 0){ 98 | $bi++; 99 | }elseif($dz_god['index'][0] == 4){ 100 | $yin++; 101 | } 102 | } 103 | } 104 | if($bi>0){ 105 | $num = $bi; 106 | }else{ 107 | $num = $yin; 108 | } 109 | //查找6合 110 | $dz = $dz_cp = $info['dz']; 111 | for($i = 0;$i<4;$i++){ 112 | $he = $this->pan->getLiuHe($dz[$i]); 113 | unset($dz_cp[$i]); 114 | if(in_array($he['index'],$dz_cp)){ 115 | $num+=2; 116 | } 117 | if($he['ju'] == $this->pan->GetTgWx($info['tg'][2])){ 118 | $num++; 119 | } 120 | 121 | } 122 | $this->des[]="你兄弟姐妹大概为{$num}或者".intval($num/2)."个"; 123 | } 124 | 125 | /** 126 | * 判断兄弟姐妹排行 127 | * @param array $tg 天干,排盘中得到的天干信息 128 | * @param array $dz 地枝,排盘中得到的地支信息 129 | * @param array $gd 性别,0为男 1 为女 130 | */ 131 | private function getBronNum($tg,$dz,$gd){ 132 | //参考http://blog.sina.com.cn/s/blog_71ae96960101f6w0.html,经过测试,不准 133 | if(($tg[2] == 2 && $dz[2] == 2) or ($tg[2] == 4 && $dz[2] == 2) or ($tg[2] == 8 && $dz[2] == 8)){ 134 | //日干为 丙寅、戊寅、壬申的家中必定为大 135 | if($gd == 0){ 136 | $this->des[] = '你是家中兄弟姐妹的大哥,兄弟(不含姐妹)中排行第一;'; 137 | }else{ 138 | $this->des[] = '你是家中兄弟姐妹的大姐,姐妹(不含兄弟)中排行第一;'; 139 | } 140 | }elseif(($tg[2] == 2 && $dz[2] == 8) or ($tg[2] == 4 && $dz[2] == 8) or ($tg[2] == 8 && $dz[2] == 2) ){ 141 | //丙申、戊申、壬寅支冲长生,定居长位,如有兄姐必克 142 | if($gd == 0){ 143 | $tmp_des = '你是家中兄弟姐妹的大哥,兄弟(不含姐妹)中排行第一,但可能不是第一胎男娃(可能有夭折或者流产)'; 144 | }else{ 145 | $tmp_des = '你是家中兄弟姐妹的大姐,姐妹(不含兄弟)中排行第一,但可能不是第一胎女娃(可能有夭折或者流产)'; 146 | } 147 | $this->des[] = $tmp_des; 148 | }elseif($tg[2] == 0 or $tg[2] == 6){ 149 | // 庚、甲为阳干;巳、亥为阴支。 150 | //庚干长生在巳,逆推—位为庚辰,庚辰为大,庚寅为次,庚子为三...... 151 | //甲干长生在亥,逆推一位为甲戍,甲戍为大,甲申为次,甲午为三...... 152 | // $cs_dz_index = $this->pan->cs_tg2dz[$tg[2]];//长生所在地支 153 | // dump($this->pan->cdz[cs_dz_index]); 154 | // $pai = $cs_dz_index-1 - $dz[2]; 155 | // if(($pai%2==0) and $pai>=0){ 156 | // $this->des[]='你在家中兄弟姐妹中排行第'.($pai/2+1); //不准 157 | // } 158 | }elseif(($dz[2] == 9 && in_array($tg[2],[2,3])) or ($dz[2] == 9 && $dz[2] == 3)){ 159 | //丁酉、己酉、癸卯”三柱自坐长生,就叫阴干阴生。如不遭刑冲必是老大。 160 | $chong = (6 + $dz[2])%12; 161 | $xing = $this->pan->getXingFrom($dz[2]); 162 | $has_xingchong=false; 163 | for($i=0;$i<4;$i++){ 164 | if($i != 2){ 165 | if(in_array($dz[$i],[$xing,$chong])){ 166 | $has_xingchong = true; 167 | break; 168 | } 169 | } 170 | } 171 | if($has_xingchong == false){ 172 | $this->des[]='你是家中兄弟姐妹的大姐,姐妹(不含兄弟)中排行第一'; 173 | } 174 | }elseif($tg[2] == 1 or $tg[2] == 7){ 175 | //乙、辛为阴干;午子为阳支。 176 | //乙木长生在午,顺推一位是乙未,乙未为老大,乙酉为次,乙亥为小...... 177 | //辛金长生在子,顺推一位是辛丑,辛丑为老大,辛卯为次,辛巳为小...... 178 | //$cs_dz_index = $this->pan->cs_tg2dz[$tg[2]];//长生所在地支 179 | //$pai = $dz[2] - $cs_dz_index+1; 180 | //echo $pai; 181 | //if(($pai%2==0) and $pai>=0){ 182 | // if($gd==0){ 183 | // $this->des[]='你在家中兄弟(不含姐妹)中排行第'.($pai/2+1); 184 | // }else{ 185 | // $this->des[]='你在家中姐妹(不含兄弟)排行第'.($pai/2+1); 186 | // } 187 | 188 | } 189 | } 190 | 191 | 192 | } 193 | 194 | /** 195 | * 纯阴纯阳 196 | * @param array $info 排盘结果 197 | */ 198 | function aboutCunYinYang(&$info){ 199 | //判断是否纯阴纯阳 200 | $cunyin = true; 201 | $cunyang = true; 202 | for($i=0;$i<4;$i++){ 203 | if($info['tg'][$i]%2 == 0 or $info['dz'][$i]%2 == 0){ 204 | $cunyin = false; 205 | break; 206 | } 207 | } 208 | for($i=0;$i<4;$i++){ 209 | if($info['tg'][$i]%2 == 1 or $info['dz'][$i]%2 == 1){ 210 | $cunyang = false; 211 | break; 212 | } 213 | } 214 | if($cunyin){ 215 | $this->des[]='此人如果没有正式的干爹或者母亲没有重婚过,那么此人的亲父命不怎么长,很早就"走了";'; 216 | $this->mark['keFather'] = true; 217 | $this->des[]='此人做事犹豫,无主见,爱撒娇,爱缠人,说话阴声细气,缺乏独当一面,'; 218 | if($info['sex'] == 0){ 219 | $this->des[] = '虽然是个男人,但真的有些娘;'; 220 | }else{ 221 | $this->des[] = '她虽然柔弱无主见,但心机重,外面是林黛玉,里面是薛宝钗,也别以为她好欺负.'; 222 | } 223 | $this->des[]='此人像母亲,不论在性格上还是在外貌上都像;'; 224 | } 225 | 226 | if($cunyang){ 227 | $this->des[]='此人如果没有正式的干娘或者父亲没有重婚过,那么此人的母亲命不怎么长,很早就"走了"'; 228 | $this->mark['keMother'] = true; 229 | $this->des[]='人性格阳刚豪爽,光明磊落,诚实,心直口快'; 230 | if($info['sex'] == 1){ 231 | $this->des[] = '虽然是个女人,但某层面上确实是个女汉子;'; 232 | } 233 | $this->des[]='此人像父亲,不论在性格上还是在外貌上都像;'; 234 | } 235 | 236 | 237 | } 238 | 239 | /** 240 | * 公历年排盘 241 | * @param int $gd 0男1女 242 | * @param int $yy 243 | * @param int $mm 244 | * @param int $dd 245 | * @param int $hh 时间(0-23) 246 | * @param int $mt 分钟数(0-59),在跨节的时辰上会需要,有的排盘忽略了跨节 247 | * @param int $ss 秒数(0-59) 248 | * @return array 249 | */ 250 | function getInfo($gd, $yy, $mm, $dd, $hh, $mt=0, $ss=0){ 251 | $info = $this->pan->getInfo($gd, $yy, $mm, $dd, $hh, $mt, $ss); 252 | $this->wuXingPingHeng($info); 253 | $this->aboutCunYinYang($info); 254 | $this->getBroSisNum($info); 255 | $this->getBronNum($info['tg'],$info['dz'],$info['sex']); 256 | //dump($this->des); 257 | return $this->des; 258 | 259 | } 260 | 261 | 262 | 263 | 264 | } -------------------------------------------------------------------------------- /server/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## V5.1.35 LTS(2019-3-2) 2 | 3 | 本次主要为常规更新,修正了一些反馈的问题。 4 | 5 | * 修正验证类自定义验证方法执行两次的问题 6 | * 模型增加`isEmpty`方法用于判断是否空模型 7 | * 改进获取器对`append`的支持 8 | * 修正一对多关联的`withCount`自关联问题 9 | * facade类注释调整 10 | * 改进关联属性的`visible`和`hidden`判断 11 | * 修正路由分组的`MISS`路由 12 | * 改进pgsql.sql 13 | 14 | ## V5.1.34 LTS(2019-1-30) 15 | 16 | 本次更新为常规更新,修正了一些反馈的问题。 17 | 18 | * 改进Request类的`has`方法,支持`patch` 19 | * 改进`unique`验证的多条件支持 20 | * 修复自定义上传验证,检测文件大小 21 | * 改进`in`查询支持表达式 22 | * 改进路由的`getBind`方法 23 | * 改进验证类的错误信息获取 24 | * 改进`response`助手函数默认值 25 | * 修正mysql的`regexp`查询 26 | * 改进模型类型强制转换写入对`Expression`对象的支持 27 | 28 | ## V5.1.33 LTS(2019-1-16) 29 | 30 | * 修复路由中存在多个相同替换的正则BUG 31 | * 修正whereLike查询 32 | * join方法支持参数绑定 33 | * 改进union方法 34 | * 修正多对多关联的attach方法 35 | * 改进验证类的正则规则自定义 36 | * 改进Request类method方法 37 | * 改进File日志类型的CLI日志写入 38 | * 改进文件日志time_format配置对JSON格式的支持 39 | 40 | ## V5.1.32 LTS(2018-12-24) 41 | 42 | 本次主要为常规更新,修正了一些反馈的问题。 43 | 44 | 45 | * 改进多对多关联的`attach`方法 46 | * 改进聚合查询的`field`处理 47 | * 改进关联的`save`方法 48 | * 修正模型`exists`方法返回值 49 | * 改进时间字段写入和输出 50 | * 改进控制器中间件的调用 51 | * 改进路由变量替换的性能 52 | * 改进缓存标签的处理机制 53 | 54 | ## V5.1.31 LTS (2018-12-9) 55 | 56 | 本次版本包含一个安全更新,建议升级。 57 | 58 | * 改进`field`方法 59 | * 改进`count`方法返回类型 60 | * `download`函数增加在浏览器中显示文件功能 61 | * 修正多对多模型的中间表数据写入 62 | * 改进`sqlsrv`驱动支持多个Schemas模式查询 63 | * 统一助手函数与\think\response\Download函数文件过期时间 64 | * 完善关联模型的`save`方法 增加`make`方法仅创建对象不保存 65 | * 修改条件表达式对静态变量的支持 66 | * 修正控制器名获取 67 | * 改进view方法的`field`解析 68 | 69 | ## V5.1.30 LTS(2018-11-30) 70 | 71 | 该版本为常规更新,修正了一些社区反馈的问题。 72 | 73 | 主要更新如下: 74 | 75 | * 改进查询类的`execute`方法 76 | * 判断路由规则定义添加对请求类型的判断 77 | * 修复`orderRaw`异常 78 | * 修正 `optimize:autoload`指令 79 | * 改进软删除的`destroy`方法造成重复执行事件的问题 80 | * 改进验证类对扩展验证规则 始终验证 不管是否`require` 81 | * 修复自定义验证`remove`所有规则的异常 82 | * 改进时间字段的自动写入支持微秒数据 83 | * 改进`Connection`类的`getrealsql`方法 84 | * 修正`https`地址的URL生成 85 | * 修复 `array_walk_recursive` 在低于PHP7.1消耗内部指针问题 86 | * 改进手动参数绑定使用 87 | * 改进聚合查询方法的`field`参数支持`Expression` 88 | 89 | ## V5.1.29 LTS(2018-11-11) 90 | 91 | 该版本主要改进了参数绑定的解析问题和提升性能,并修正了一些反馈的问题。 92 | 93 | * 改进手动参数绑定 94 | * 修正MISS路由的分组参数无效问题 95 | * 行为支持对象的方法 96 | * 修正全局查询范围 97 | * 改进`belongsto`关联的`has`方法 98 | * 改进`hasMany`关联 99 | * 改进模型观察者多次注册的问题 100 | * 改进`query`类的默认查询参数处理 101 | * 修正`parseBetween`解析方法 102 | * 改进路由地址生成的本地域名支持 103 | * 改进参数绑定的实际URL解析性能 104 | * 改进`Env`类的`getEnv`和`get`方法 105 | * 改进模板缓存的生成优化 106 | * 修复验证类的多语言支持 107 | * 修复自定义场景验证`remove`规则异常 108 | * File类添加是否自动补全扩展名的选项 109 | * 改进`strpos`对子串是否存在的判断 110 | * 修复`choice`无法用值选择第一个选项问题 111 | * 验证器支持多维数组取值验证 112 | * 改进解析`extend`和`block`标签的正则 113 | 114 | ## V5.1.28 LTS(2018-10-29) 115 | 116 | 该版本主要修正了上一个版本存在的一些问题,并改进了关联查询 117 | 118 | * 改进聚合查询方法的字段支持DISTINCT 119 | * 改进定义路由后url函数的端口生成 120 | * 改进控制器中间件对`swoole`等的支持 121 | * 改进Log类`save`方法 122 | * 改进验证类的闭包验证参数 123 | * 多对多关联支持指定中间表数据的名称 124 | * 关联聚合查询支持闭包方式指定聚合字段 125 | * 改进Lang类`get`方法 126 | * 多对多关联增加判断关联数据是否存在的方法 127 | * 改进关联查询使用`fetchsql`的情况 128 | * 改进修改器的是否已经执行判断 129 | * 增加`afterWith`和`beforeWith`验证规则 用于比较日期字段 130 | 131 | ## V5.1.27 LTS(2018-10-22) 132 | 133 | 该版本主要修正了路由绑定的参数,改进了修改器的执行多次问题,并正式宣布为LTS版本! 134 | 135 | 136 | * 修正路由绑定的参数丢失问题 137 | * 修正路由别名的参数获取 138 | * 改进修改器会执行多次的问题 139 | 140 | ## V5.1.26(2018-10-12) 141 | 142 | 该版本主要修正了上一个版本的一些问题,并改进了全局查询范围的支持,同时包含了一个安全更新。 143 | 144 | 145 | * 修正单一模块下注解路由无效的问题 146 | * 改进数据库的聚合查询的字段处理 147 | * 模型类增加`globalScope`属性定义 用于指定全局的查询范围 148 | * 模型的`useGlobalScope`方法支持传入数组 用于指定当前查询需要使用的全局查询范围 149 | * 改进数据集的`order`方法对数字类型的支持 150 | * 修正上一个版本`order`方法解析的一处BUG 151 | * 排序字段不合法或者错误的时候抛出异常 152 | * 改进`Request`类的`file`方法对上传文件的错误判断 153 | 154 | ## V5.1.25(2018-9-21) 155 | 156 | 该版本主要改进了查询参数绑定的性能和对浮点型的支持,以及一些细节的完善。 157 | 158 | * 修正一处命令行问题 159 | * 改进`Socketlog`日志驱动,支持自定义默认展开日志类别 160 | * 修正`MorphMany`一处bug 161 | * 跳转到上次记住的url,并支持默认值 162 | * 改进模型的异常提示 163 | * 改进参数绑定对浮点型的支持 164 | * 改进`order`方法解析 165 | * 改进`json`字段数据的自动编码 166 | * 改进日志`log_write`可能造成的日志写入死循环 167 | * Log类增加`log_level`行为标签位置,用于对某个类型的日志进行处理 168 | * Route类增加`clear`方法清空路由规则 169 | * 分布式数据库配置支持使用数组 170 | * 单日志文件也支持`max_files`参数 171 | * 改进查询参数绑定的性能 172 | * 改进别名路由的URL后缀参数检测 173 | * 控制器前置方法和控制器中间件的`only`和`except`定义不区分大小写 174 | 175 | ## V5.1.24(2018-9-5) 176 | 177 | 该版本主要增加了命令行的表格输出功能,并增加了查看路由定义的指令,以及修正了社区的一些反馈问题。 178 | 179 | * 修正`Request`类的`file`方法 180 | * 修正路由的`cache`方法 181 | * 修正路由缓存的一处问题 182 | * 改进上传文件获取的异常处理 183 | * 改进`fetchCollection`方法支持传入数据集类名 184 | * 修正多级控制器的注解路由生成 185 | * 改进`Middleware`类`clear`方法 186 | * 增加`route:list`指令用于[查看定义的路由](752690) 并支持排序 187 | * 命令行增加`Table`输出类 188 | * `Command`类增加`table`方法用于输出表格 189 | * 改进搜索器查询方法支持别名定义 190 | * 命令行配置增加`auto_path`参数用于定义自动载入的命令类路径 191 | * 增加`make:command`指令用于[快速生成指令](354146) 192 | * 改进`make:controller`指令对操作方法后缀的支持 193 | * 改进命令行的定义文件支持索引数组 用于指令对象的惰性加载 194 | * 改进`value`和`column`方法对后续查询结果的影响 195 | * 改进`RuleName`类的`setRule`方法 196 | 197 | ## V5.1.23(2018-8-23) 198 | 199 | 该版本主要改进了数据集对象的处理,增加了`findOrEmpty`方法,并且修正了一些社区反馈的BUG。 200 | 201 | * 数据集类增加`diff`/`intersect`方法用于获取差集和交集(默认根据主键值比较) 202 | * 数据集类增加`order`方法支持指定字段排序 203 | * 数据集类增加`map`方法使用回调函数处理数据并返回新的数据集对象 204 | * Db增加`allowEmpty`方法允许`find`方法在没有数据的时候返回空数组或者空模型对象而不是null 205 | * Db增加`findOrEmpty`方法 206 | * Db增加`fetchCollection`方法用于指定查询返回数据集对象 207 | * 改进`order`方法的数组方式解析,增强安全性 208 | * 改进`withSearch`方法,支持第三个参数传入字段前缀标识,用于多表查询字段搜索 209 | * 修正`optimize:route`指令开启类库后缀后的注解路由生成 210 | * 修正redis缓存及session驱动 211 | * 支持指定`Yaconf`的独立配置文件 212 | * 增加`yaconf`助手函数用于配置文件 213 | 214 | 215 | ## V5.1.22(2018-8-9) 216 | 217 | 该版本主要增加了模型搜索器和`withJoin`方法,完善了模型输出和对`Yaconf`的支持,修正了一些社区反馈的BUG。 218 | 219 | * 改进一对一关联的`table`识别问题 220 | * 改进内置`Facade`类 221 | * 增加`withJoin`方法支持`join`方式的[一对一关联](一对一关联.md)查询 222 | * 改进`join`预载入查询的空数据问题 223 | * 改进`Config`类的`load`方法支持快速加载配置文件 224 | * 改进`execute`方法和事务的断线重连 225 | * 改进`memcache`驱动的`has`方法 226 | * 模型类支持定义[搜索器](搜索器.md)方法 227 | * 完善`Config`类对`Yaconf`的支持 228 | * 改进模型的`hidden/visible/append/withAttr`方法,支持在[查询前后调用](数组访问.md),以及支持数据集对象 229 | * 数据集对象增加`where`方法根据字段或者关联数据[过滤数据](模型数据集.md) 230 | * 改进AJAX请求的`204`判断 231 | 232 | 233 | ## V5.1.21(2018-8-2) 234 | 235 | 该版本主要增加了下载响应对象和数组查询对象的支持,并修正了一些社区反馈的问题。 236 | 237 | * 改进核心对象的无用信息调试输出 238 | * 改进模型的`isRelationAttr`方法判断 239 | * 模型类的`get`和`all`方法并入Db类 240 | * 增加[下载响应对象](文件下载.md)和`download`助手函数 241 | * 修正别名路由配置定义读取 242 | * 改进`resultToModel`方法 243 | * 修正开启类库后缀后的注解路由生成 244 | * `Response`类增加`noCache`快捷方法 245 | * 改进路由对象在`Swoole`/`Workerman`下面参数多次合并问题 246 | * 修正路由`ajax`/`pjax`参数后路由变量无法正确获取的问题 247 | * 增加清除中间件的方法 248 | * 改进依赖注入的参数规范自动识别(便于对接前端小写+下划线规范) 249 | * 改进`hasWhere`的数组条件的字段判断 250 | * 增加[数组查询对象](高级查询.md)`Where`支持(喜欢数组查询的福音) 251 | * 改进多对多关联的闭包支持 252 | 253 | ## V5.1.20(2018-7-25) 254 | 255 | 该版本主要增加了Db和模型的动态获取器的支持,并修正了一些已知问题。 256 | 257 | * Db类添加[获取器支持](703981) 258 | * 支持模型及关联模型字段[动态定义获取器](354046) 259 | * 动态获取器支持`JSON`字段 260 | * 改进路由的`before`行为执行(匹配后执行) 261 | * `Config`类支持`Yaconf` 262 | * 改进Url生成的端口问题 263 | * Request类增加`setUrl`和`setBaseUrl`方法 264 | * 改进页面trace的信息显示 265 | * 修正`MorphOne`关联 266 | * 命令行添加[查看版本指令](703994) 267 | 268 | ## V5.1.19 (2018-7-13) 269 | 270 | 该版本是一个小幅改进版本,针对`Swoole`和`Workerman`的`Cookie`支持做了一些改进,并修正了一些已知的问题。 271 | 272 | 273 | * 改进query类`delete`方法对软删除条件判断 274 | * 修正分表查询的软删除问题 275 | * 模型查询的时候同时传入`table`和`name`属性 276 | * 容器类增加`IteratorAggregate`和`Countable`接口支持 277 | * 路由分组支持对下面的资源路由统一设置`only/except/vars`参数 278 | * 改进Cookie类更好支持扩展 279 | * 改进Request类`post`方法 280 | * 改进模型自关联的自动识别 281 | * 改进Request类对`php://input`数据的处理 282 | 283 | 284 | ## V5.1.18 (2018-6-30) 285 | 286 | 该版本主要完善了对`Swoole`和`Workerman`的`HttpServer`运行支持,改进`Request`类,并修正了一些已知的问题。 287 | 288 | * 改进关联`append`方法的处理 289 | * 路由初始化和检测方法分离 290 | * 修正`destroy`方法强制删除 291 | * `app_init`钩子位置移入`run`方法 292 | * `think-swoole`扩展更新到2.0版本 293 | * `think-worker`扩展更新到2.0版本 294 | * 改进Url生成的域名自动识别 295 | * `Request`类增加`setPathinfo`方法和`setHost`方法 296 | * `Request`类增加`withGet`/`withPost`/`withHeader`/`withServer`/`withCookie`/`withEnv`方法进行赋值操作 297 | * Route类改进`host`属性的获取 298 | * 解决注解路由配置不生效的问题 299 | * 取消Test日志驱动,改为使用`close`设置关闭全局日志写入 300 | * 修正路由的`response`参数 301 | * 修正204响应输出的判断 302 | 303 | ## V5.1.17 (2018-6-18) 304 | 305 | 该版本主要增加了控制器中间件的支持,改进了路由功能,并且修正了社区反馈的一些问题。 306 | 307 | * 修正软删除的`delete`方法 308 | * 修正Query类`Count`方法 309 | * 改进多对多`detach`方法 310 | * 改进Request类`Session`方法 311 | * 增加控制器中间件支持 312 | * 模型类增加`jsonAssoc`属性用于定义json数据是否返回数组 313 | * 修正Request类`method`方法的请求伪装 314 | * 改进静态路由的匹配 315 | * 分组首页路由自动完整匹配 316 | * 改进sqlsrv的`column`方法 317 | * 日志类的`apart_level`配置支持true自动生成对应类型的日志文件 318 | * 改进`204`输出判断 319 | * 修正cli下页面输出的BUG 320 | * 验证类使用更高效的`ctype`验证机制 321 | * 改进Request类`cookie`方法 322 | * 修正软删除的`withTrashed`方法 323 | * 改进多态一对多的预载入查询 324 | * 改进Query类`column`方法的缓存读取 325 | * Query类增加`whereBetweenTimeField`方法 326 | * 改进分组下多个相同路由规则的合并匹配问题 327 | * 路由类增加`getRule`/`getRuleList`方法获取定义的路由 328 | 329 | ## V5.1.16 (2018-6-7) 330 | 331 | 该版本主要修正了社区反馈的一些问题,并对Request类做了进一步规范和优化。 332 | 333 | * 改进Session类的`boot`方法 334 | * App类的初始化方法可以单独执行 335 | * 改进Request类的`param`方法 336 | * 改进资源路由的变量替换 337 | * Request类增加`__isset`方法 338 | * 改进`useGlobalScope`方法对软删除的影响 339 | * 修正命令行调用 340 | * 改进Cookie类`init`方法 341 | * 改进多对多关联删除的返回值 342 | * 一对多关联写入支持`replace` 343 | * 路由增加`filter`检测方法,用于通过请求参数检测路由是否匹配 344 | * 取消Request类`session/env/server`方法的`filter`参数 345 | * 改进关联的指定属性输出 346 | * 模型删除操作删除后不清空对象数据仅作标记 347 | * 调整模型的`save`方法返回值为布尔值 348 | * 修正Request类`isAjax`方法 349 | * 修正中间件的模块配置读取 350 | * 取消Request类的请求变量的设置功能 351 | * 取消请求变量获取的默认修饰符 352 | * Request类增加`setAction/setModule/setController`方法 353 | * 关联模型的`delete`方法调用Query类 354 | * 改进URL生成的域名识别 355 | * 改进URL检测对已定义路由的域名判断 356 | * 模型类增加`isExists`和`isForce`方法 357 | * 软删除的`destroy`和`restore`方法返回值调整为布尔值 358 | 359 | ## V5.1.15 (2018-6-1) 360 | 361 | 该版本主要改进了路由缓存的性能和缓存方式设置,增加了JSON格式文件日志的支持,并修正了社区反馈的一些问题。 362 | 363 | * 容器类增加`exists`方法 仅判断是否存在对象实例 364 | * 取消配置类的`autoload`方法 365 | * 改进路由缓存大小提高性能 366 | * 改进Dispatch类`init`方法 367 | * 增加`make:validate`指令生成验证器类 368 | * Config类`get`方法支持默认值参数 369 | * 修正字段缓存指令 370 | * 改进App类对`null`数据的返回 371 | * 改进模型类的`__isset`方法判断 372 | * 修正`Query`类的`withAggregate`方法 373 | * 改进`RuleItem`类的`setRuleName`方法 374 | * 修正依赖注入和参数的冲突问题 375 | * 修正Db类对第三方驱动的支持 376 | * 修正模型类查询对象问题 377 | * 修正File缓存驱动的`has`方法 378 | * 修正资源路由嵌套 379 | * 改进Request类对`$_SERVER`变量的读取 380 | * 改进请求缓存处理 381 | * 路由缓存支持指定单独的缓存方式和参数 382 | * 修正资源路由的中间件多次执行问题 383 | * 修正`optimize:config`指令 384 | * 文件日志支持`JSON`格式日志保存 385 | * 修正Db类`connect`方法 386 | * 改进Log类`write`方法不会自动写入之前日志 387 | * 模型的关联操作默认启用事务 388 | * 改进软删除的事件响应 389 | 390 | ## V5.1.14 (2018-5-18) 391 | 392 | 该版本主要对底层容器进行了一些优化改进,并增加了路由缓存功能,可以进一步提升路由性能。 393 | 394 | * 依赖注入的对象参数传入改进 395 | * 改进核心类的容器实例化 396 | * 改进日期字段的读取 397 | * 改进验证类的`getScene`方法 398 | * 模型的`create`方法和`save`方法支持`replace`操作 399 | * 改进`Db`类的调用机制 400 | * App类调整为容器类 401 | * 改进容器默认绑定 402 | * `Loader`类增加工厂类的实例化方法 403 | * 增加路由变量默认规则配置参数 404 | * 增加路由缓存设计 405 | * 错误处理机制改进 406 | * 增加清空路由缓存指令 407 | 408 | 409 | ## V5.1.13 (2018-5-11) 410 | 411 | 该版本主要增加了MySQL的XA事务支持,模型事件支持观察者,以及对Facade类的改进。 412 | 413 | * 改进自动缓存 414 | * 改进Url生成 415 | * 修正数据缓存 416 | * 修正`value`方法的缓存 417 | * `join`方法和`view`方法的条件支持使用`Expression`对象 418 | * 改进驱动的`parseKey`方法 419 | * 改进Request类`host`方法和`domain`方法对端口的处理 420 | * 模型增加`withEvent`方法用于控制当前操作是否需要执行模型事件 421 | * 模型`setInc/setDec`方法支持更新事件 422 | * 模型添加`before_restore/after_restore`事件 423 | * 增加模型事件观察者 424 | * 路由增加`mobile`方法设置是否允许手机访问 425 | * 数据库XA事务支持 426 | * 改进索引数组查询对`IN`查询的支持 427 | * 修正`invokeMethod`方法 428 | * 修正空数据写入返回值的BUG 429 | * redis驱动支持`predis` 430 | * 改进`parseData`方法 431 | * 改进模块加载 432 | * App类初始化方法调整 433 | * 改进数组查询对表达式`Expression`对象支持 434 | * 改进闭包的依赖注入调用 435 | * 改进多对多关联的中间表模型更新 436 | * 增加容器中对象的自定义实例化 437 | 438 | ## V5.1.12 (2018-4-25) 439 | 440 | 该版本主要改进了主从查询的及时性,并支持动态设置请求数据。 441 | 442 | * 支持动态设置请求数据 443 | * 改进`comment`方法解析 444 | * 修正App类`__unset`方法 445 | * 改进url生成的域名绑定 446 | * 改进主从查询的及时性 447 | * 修正`value`的数据缓存功能 448 | * 改进分页类的集合对象方法调用 449 | * 改进Db类的代码提示 450 | * SQL日志增加主从标记 451 | 452 | ## V5.1.11 (2018-4-19) 453 | 454 | 该版本为安全和修正版本,改进了JSON查询的参数绑定问题和容器类对象实例获取,并包含一处可能的安全隐患,建议更新。 455 | 456 | * 支持指定JSON数据查询的字段类型 457 | * 修正`selectInsert`方法 458 | * `whereColumn`方法支持数组方式 459 | * 改进容器类`make`方法 460 | * 容器类`delete`方法支持数组 461 | * 改进`composer`自动加载 462 | * 改进模板引擎 463 | * 修正`like`查询的一处安全隐患 464 | 465 | ## V5.1.10 (2018-4-16) 466 | 467 | 该版本为修正版本,修正上一个版本的一些BUG,并增强了`think clear`指令。 468 | 469 | * 改进`orderField`方法 470 | * 改进`exists`查询 471 | * 修改cli模式入口文件位置计算 472 | * 修正`null`查询 473 | * 改进`parseTime`方法 474 | * 修正关联预载入查询 475 | * 改进`mysql`驱动 476 | * 改进`think clear`指令 支持 `-c -l -r `选项 477 | * 改进路由规则对`/`结尾的支持 478 | 479 | ## V5.1.9 (2018-4-12) 480 | 481 | 该版本主要是一些改进和修正,并包含一个安全更新,是一个推荐更新版本。 482 | 483 | * 默认模板渲染规则支持配置保持操作方法名 484 | * 改进`Request`类的`ip`方法 485 | * 支持模型软删除字段的默认值定义 486 | * 改进路由变量规则对中文的支持 487 | * 使用闭包查询的时候使用`cache(true)` 抛出异常提示 488 | * 改进`Loader`类`loadComposerAutoloadFiles`方法 489 | * 改进查询方法安全性 490 | * 修正路由地址中控制器名驼峰问题 491 | * 调整上一个版本的`module_init`和`app_begin`的钩子顺序问题 492 | * 改进CLI命令行执行的问题 493 | * 修正社区反馈的其它问题 494 | 495 | ## V5.1.8 (2018-4-5) 496 | 497 | 该版本主要改进了中间件的域名和模块支持,并同时修正了几个已知问题。 498 | 499 | * 增加`template.auto_rule` 参数设置默认模板渲染的操作名自动转换规则 500 | * 默认模板渲染规则改由视图驱动实现 501 | * 修正路由标识定义 502 | * 修正控制器路由方法 503 | * 改进Request类`ip`方法支持自定义代理IP参数 504 | * 路由注册中间件支持数组方式别名 505 | * 改进命令行执行下的`composer`自动加载 506 | * 添加域名中间件注册支持 507 | * 全局中间件支持模块定义文件 508 | * Log日志配置支持`close`参数可以全局关闭日志写入 509 | * 中间件方法中捕获`HttpResponseException`异常 510 | * 改进中间件的闭包参数传入 511 | * 改进分组路由的延迟解析 512 | * 改进URL生成对域名绑定的支持 513 | * 改进文件缓存和文件日志驱动的并发支持 514 | 515 | ## V5.1.7 (2018-3-28) 516 | 517 | 该版本主要修正了路由的一些问题,并改进了查询的安全性。 518 | 519 | * 支持`middleware`配置文件预先定义中间件别名方便路由调用 520 | * 修正资源路由 521 | * 改进`field`方法 自动识别`fieldRaw` 522 | * 增加`Expression`类 523 | * Query类增加`raw`方法 524 | * Query类的`field`/ `order` 和` where`方法都支持使用`raw`表达式查询 525 | * 改进`inc/dec`查询 支持批量更新 526 | * 改进路由分组 527 | * 改进Response类`create`方法 528 | * 改进composer自动加载 529 | * 修正域名路由的`append`方法 530 | * 修正操作方法的初始化方法获取不到问题 531 | 532 | ## V5.1.6 (2018-3-26) 533 | 534 | 该版本主要改进了路由规则的匹配算法,大幅提升了路由性能。并正式引入了中间件的支持,可以在路由中定义或者全局定义。另外包含了一个安全更新,是一个建议更新版本。 535 | 536 | * 改进URL生成对路由`ext`方法的支持 537 | * 改进查询缓存对不同数据库相同表名的支持 538 | * 改进composer自动加载的性能 539 | * 改进空路由变量对默认参数的影响 540 | * mysql的`json`字段查询支持多级 541 | * Query类增加`option`方法 542 | * 优化路由匹配 543 | * 修复验证规则数字键名丢失问题 544 | * 改进路由Url生成 545 | * 改进一对一关联预载入查询 546 | * Request类增加`rootDomain`方法 547 | * 支持API资源控制器生成 `make:controller --api` 548 | * 优化Template类的标签解析 549 | * 容器类增加删除和清除对象实例的方法 550 | * 修正MorphMany关联的`eagerlyMorphToMany`方法一处错误 551 | * Container类的异常捕获改进 552 | * Domain对象支持`bind`方法 553 | * 修正分页参数 554 | * 默认模板的输出规则不受URL影响 555 | * 注解路由支持多级控制器 556 | * Query类增加`getNumRows`方法获取前次操作影响的记录数 557 | * 改进查询条件的性能 558 | * 改进模型类`readTransform`方法对序列化类型的处理 559 | * Log类增加`close`方法可以临时关闭当前请求的日志写入 560 | * 文件日志方式增加自动清理功能(设置`max_files`参数) 561 | * 修正Query类的`getPk`方法 562 | * 修正模板缓存的布局开关问题 563 | * 修正Query类`select`方法的缓存 564 | * 改进input助手函数 565 | * 改进断线重连的信息判断 566 | * 改进正则验证方法 567 | * 调整语言包的加载顺序 放到`app_init`之前 568 | * controller类`fetch`方法改为`final` 569 | * 路由地址中的变量支持使用``方式 570 | * 改进XMLResponse 支持传入编码过的xml内容 571 | * 修正Query类`view`方法的数组表名支持 572 | * 改进路由的模型闭包绑定 573 | * 改进分组变量规则的继承 574 | * 改进`cli-server`模式下的`composer`自动加载 575 | * 路由变量规则异常捕获 576 | * 引入中间件支持 577 | * 路由定义增加`middleware`方法 578 | * 增加生成中间件指令`make:middleware` 579 | * 增加全局中间件定义支持 580 | * 改进`optimize:config`指令对全局中间件的支持 581 | * 改进config类`has`方法 582 | * 改进时间查询的参数绑定 583 | * 改进`inc/dec/exp`查询的安全性 584 | 585 | 586 | ## V5.1.5 (2018-1-31) 587 | 588 | 该版本主要增强了数据库的JSON查询,并支持JSON字段的聚合查询,改进了一些性能问题,修正了路由的一些BUG,主要更新如下: 589 | 590 | * 改进数据集查询对`JSON`数据的支持 591 | * 改进聚合查询对`JSON`字段的支持 592 | * 模型类增加`getOrFail`方法 593 | * 改进数据库驱动的`parseKey`方法 594 | * 改进Query类`join`方法的自关联查询 595 | * 改进数据查询不存在不生成查询缓存 596 | * 增加`run`命令行指令启动内置服务器 597 | * `Request`类`pathinfo`方法改进对`cli-server`支持 598 | * `Session`类增加`use_lock`配置参数设置是否启用锁机制 599 | * 优化`File`缓存自动生成空目录的问题 600 | * 域名及分组路由支持`append`方法传递隐式参数 601 | * 改进日志的并发写入问题 602 | * 改进`Query`类的`where`方法支持传入`Query`对象 603 | * 支持设置单个日志文件的文件名 604 | * 修正路由规则的域名条件约束 605 | * `Request`类增加`subDomain`方法用于获取当前子域名 606 | * `Response`类增加`allowCache`方法控制是否允许请求缓存 607 | * `Request`类增加`sendData`方法便于扩展 608 | * 改进`Env`类不依赖`putenv`方法 609 | * 改进控制台`trace`显示错误 610 | * 改进`MorphTo`关联 611 | * 改进完整路由匹配后带斜线访问出错的情况 612 | * 改进路由的多级分组问题 613 | * 路由url地址生成支持多级分组 614 | * 改进路由Url生成的`url_convert`参数的影响 615 | * 改进`miss`和`auto`路由内部解析 616 | * 取消预载入关联查询缓存功能 617 | 618 | ## V5.1.4 (2018-1-19) 619 | 620 | 该版本主要增强了数据库和模型操作,主要更新如下: 621 | 622 | * 支持设置 `deleteTime`属性为`false` 关闭软删除 623 | * 模型增加`getError`方法 624 | * 改进Query类的`getTableFields`/`getFieldsType`方法 支持表名自动获取 625 | * 模型类`toCollection`方法增加参数指定数据集类 626 | * 改进`union`查询 627 | * 关联预载入`with`方法增加缓存参数 628 | * 改进模型类的`get`和`all`方法的缓存 支持关联缓存 629 | * 支持`order by field`操作 630 | * 改进`insertAll`分批写入 631 | * 改进`json`字段数据支持 632 | * 增加JSON数据的模型对象化操作 633 | * 改进路由`ext`参数检测 634 | * 修正`rule`方法的`method`参数使用 `get|post` 方式注册路由的问题 635 | 636 | ## V5.1.3 (2018-1-12) 637 | 638 | 该版本主要改进了路由及调整函数加载顺序,主要更新如下: 639 | 640 | * 增加`env`助手函数; 641 | * 增加`route`助手函数; 642 | * 增加视图路由方法; 643 | * 增加路由重定向方法; 644 | * 路由默认区分最后的目录斜杆(支持设置不区分); 645 | * 调整公共文件和配置文件的加载顺序(可以在配置文件中直接使用助手函数); 646 | * 视图类增加`filter`方法设置输出过滤; 647 | * `view`助手函数增加`filter`参数; 648 | * 改进缓存生成指令; 649 | * Session类的`get`方法支持获取多级; 650 | * Request类`only`方法支持指定默认值; 651 | * 改进路由分组; 652 | * 修正使用闭包查询的时候自动数据缓存出错的情况; 653 | * 废除`view_filter`钩子位置; 654 | * 修正分组下面的资源路由; 655 | * 改进session驱动; 656 | 657 | ## V5.1.2 (2018-1-8) 658 | 659 | 该版本改进了配置类及数据库类,主要更新如下: 660 | 661 | * 修正嵌套路由分组; 662 | * 修正自定义模板标签界定符后表达式语法出错的情况; 663 | * 修正自关联的多次调用问题; 664 | * 修正数组查询的`null`条件查询; 665 | * 修正Query类的`order`及`field`的一处可能的BUG; 666 | * 配置参数设置支持三级; 667 | * 配置对象支持`ArrayAccess`; 668 | * App类增加`path`方法用于设置应用目录; 669 | * 关联定义增加`selfRelation`方法用于设置是否为自关联; 670 | 671 | ## V5.1.1 (2018-1-3) 672 | 673 | 修正一些反馈的BUG,包括: 674 | 675 | * 修正Cookie类存取数组的问题 676 | * 修正Controller的`fetch`方法 677 | * 改进跨域请求 678 | * 修正`insertAll`方法 679 | * 修正`chunk`方法 680 | 681 | ## V5.1.0 (2018-1-1) 682 | 683 | 主要更新如下: 684 | 685 | * 增加注解路由支持 686 | * 路由支持跨域请求设置 687 | * 增加`app_dispatch`钩子位置 688 | * 修正多对多关联的`detach`方法 689 | * 修正软删除的`destroy`方法 690 | * Cookie类`httponly`参数默认为false 691 | * 日志File驱动增加`single`参数配置记录同一个文件(不按日期生成) 692 | * 路由的`ext`和`denyExt`方法支持不传任何参数 693 | * 改进模型的`save`方法对`oracle`的支持 694 | * Query类的`insertall`方法支持配合`data`和`limit`方法 695 | * 增加`whereOr`动态查询支持 696 | * 日志的ip地址记录改进 697 | * 模型`saveAll`方法支持`isUpdate`方法 698 | * 改进`Pivot`模型的实例化操作 699 | * 改进Model类的`data`方法 700 | * 改进多对多中间表模型类 701 | * 模型增加`force`方法强制更新所有数据 702 | * Hook类支持设置入口方法名称 703 | * 改进验证类 704 | * 改进`hasWhere`查询的数据重复问题 705 | * 模型的`saveall`方法返回数据集对象 706 | * 改进File缓存的`clear`方法 707 | * 缓存添加统一的序列化机制 708 | * 改进泛三级域名的绑定 709 | * 改进泛域名的传值和取值 710 | * Request类增加`panDomain`方法 711 | * 改进废弃字段判断 712 | * App类增加`create`方法用于实例化应用类库 713 | * 容器类增加`has`方法 714 | * 改进多数据库切换连接 715 | * 改进断线重连的异常捕获 716 | * 改进模型类`buildQuery`方法 717 | * Query类增加`unionAll`方法 718 | * 关联统计功能增强(支持Sum/Max/Min/Avg) 719 | * 修正延迟写入 720 | * chunk方法支持复合主键 721 | * 改进JSON类型的写入 722 | * 改进Mysql的insertAll方法 723 | * Model类`save`方法改进复合主键包含自增的情况 724 | * 改进Query类`inc`和`dec`方法的关键字处理 725 | * File缓存inc和dec方法保持原来的有效期 726 | * 改进redis缓存的有效期判断 727 | * 增加checkRule方法用于单独数据的多个验证规则 728 | * 修正setDec方法的延迟写入 729 | * max和min方法增加force参数 730 | * 二级配置参数区分大小写 731 | * 改进join方法自关联的问题 732 | * 修正关联模型自定义表名的情况 733 | * Query类增加getFieldsType和getTableFields方法 734 | * 取消视图替换功能及view_replace_str配置参数 735 | * 改进域名绑定模块后的额外路由规则问题 736 | * 改进mysql的insertAll方法 737 | * 改进insertAll方法写入json字段数据的支持 738 | * 改进redis长连接多编号库的情况 739 | 740 | ## RC3版本(2017-11-6) 741 | 742 | 主要更新如下: 743 | 744 | * 改进redis驱动的`get`方法 745 | * 修正Query类的`alias`方法 746 | * `File`类错误信息支持多语言 747 | * 修正路由的额外参数解析 748 | * 改进`whereTime`方法 749 | * 改进Model类`getAttr`方法 750 | * 改进App类的`controller`和`validate`方法支持多层 751 | * 改进`HasManyThrough`类 752 | * 修正软删除的`restore`方法 753 | * 改进`MorpthTo`关联 754 | * 改进数据库驱动类的`parseKey`方法 755 | * 增加`whereField`动态查询方法 756 | * 模型增加废弃字段功能 757 | * 改进路由的`after`行为检查和`before`行为机制 758 | * 改进路由分组的检查 759 | * 修正mysql的`json`字段查询 760 | * 取消Connection类的`quote`方法 761 | * 改进命令行的支持 762 | * 验证信息支持多语言 763 | * 修正路由模型绑定 764 | * 改进参数绑定类型对枚举类型的支持 765 | * 修正模板的`{$Think.version} `输出 766 | * 改进模板`date`函数解析 767 | * 改进`insertAll`方法支持分批执行 768 | * Request类`host`方法支持反向代理 769 | * 改进`JumpResponse`支持区分成功和错误模板 770 | * 改进开启类库后缀后的关联外键自动识别问题 771 | * 修正一对一关联的JOIN方式预载入查询问题 772 | * Query类增加`hidden`方法 773 | 774 | ## RC2版本(2017-10-17) 775 | 776 | 主要更新如下: 777 | 778 | * 修正视图查询 779 | * 修正资源路由 780 | * 修正`HasMany`关联 修正`where`方法的闭包查询 781 | * 一对一关联绑定属性到父模型后 关联属性不再保留 782 | * 修正应用的命令行配置文件读取 783 | * 改进`Connection`类的`getCacheKey`方法 784 | * 改进文件上传的非法图像异常 785 | * 改进验证类的`unique`规则 786 | * Config类`get`方法支持获取一级配置 787 | * 修正count方法对`fetchSql`的支持 788 | * 修正mysql驱动对`socket`支持 789 | * 改进Connection类的`getRealSql`方法 790 | * 修正`view`助手函数 791 | * Query类增加`leftJoin` `rightJoin` 和 `fullJoin`方法 792 | * 改进app_namespace的获取 793 | * 改进`append`方法对一对一`bind`属性的支持 794 | * 改进关联的`saveall`方法的返回值 795 | * 路由标识设置异常修复 796 | * 改进Route类`rule`方法 797 | * 改进模型的`table`属性设置 798 | * 改进composer autofile的加载顺序 799 | * 改进`exception_handle`配置对闭包的支持 800 | * 改进app助手函数增加参数 801 | * 改进composer的加载路径判断 802 | * 修正路由组合变量的URL生成 803 | * 修正路由URL生成 804 | * 改进`whereTime`查询并支持扩展规则 805 | * File类的`move`方法第二个参数支持`false` 806 | * 改进Config类 807 | * 改进缓存类`remember`方法 808 | * 惯例配置文件调整 Url类当普通模式参数的时候不做`urlencode`处理 809 | * 取消`ROOT_PATH`和`APP_PATH`常量定义 如需更改应用目录 自己重新定义入口文件 810 | * 增加`app_debug`的`Env`获取 811 | * 修正泛域名绑定 812 | * 改进查询表达式的解析机制 813 | * mysql增加`regexp`查询表达式 支持正则查询 814 | * 改进查询表达式的异常判断 815 | * 改进model类的`destroy`方法 816 | * 改进Builder类 取消`parseValue`方法 817 | * 修正like查询的参数绑定问题 818 | * console和start文件移出核心纳入应用库 819 | * 改进Db类主键删除方法 820 | * 改进泛域名绑定模块 821 | * 取消`BIND_MODULE`常量 改为在入口文件使用`bind`方法设置 822 | * 改进数组查询 823 | * 改进模板渲染的异常处理 824 | * 改进控制器基类的架构方法参数 825 | * 改进Controller类的`success`和`error`方法 826 | * 改进对浏览器`JSON-Handle`插件的支持 827 | * 优化跳转模板的移动端显示 828 | * 修正模型查询的`chunk`方法对时间字段的支持 829 | * 改进trace驱动 830 | * Collection类增加`push`方法 831 | * 改进Redis Session驱动 832 | * 增加JumpResponse驱动 833 | 834 | 835 | ## RC1(2017-9-8) 836 | 837 | 主要新特性为: 838 | 839 | * 引入容器和Facade支持 840 | * 依赖注入完善和支持更多场景 841 | * 重构的(对象化)路由 842 | * 配置和路由目录独立 843 | * 取消系统常量 844 | * 助手函数增强 845 | * 类库别名机制 846 | * 模型和数据库增强 847 | * 验证类增强 848 | * 模板引擎改进 849 | * 支持PSR-3日志规范 850 | * RC1版本取消了5.0多个字段批量数组查询的方式 -------------------------------------------------------------------------------- /server/application/index/service/Stars.php: -------------------------------------------------------------------------------- 1 | [1,7], 30 | 1=>[0,8], 31 | 2=>[9,11], 32 | 3=>[9,11], 33 | 4=>[1,7], 34 | 5=>[0,8], 35 | 6=>[6,2], 36 | 7=>[6,2], 37 | 8=>[3,5], 38 | 9=>[3,5] 39 | ]; 40 | $tianyi = $map[$tg[0]]+$map[$tg[2]];//日或年 41 | for($i = 0;$i<4;$i++){ 42 | if(in_array($dz[$i], $tianyi)){ 43 | $star[$i][$key]=$value; 44 | } 45 | } 46 | } 47 | 48 | /** 49 | * 太极贵人 50 | *甲乙生人子午中,丙丁鸡兔定亨通; 51 | *戊己两干临四季,庚辛寅亥禄丰隆; 52 | *壬癸巳申偏喜美,值此应当福气钟;以年干或日干为准,四柱地支见者为是 53 | */ 54 | public function taiJi($info,&$star,$key,$value){ 55 | $tg = $info['tg']; 56 | $dz = $info['dz']; 57 | $map = [ 58 | 0=>[0,6], 59 | 1=>[0,6], 60 | 2=>[3,9], 61 | 3=>[3,9], 62 | 4=>[4,10,1,7], 63 | 5=>[4,10,1,7], 64 | 6=>[2,11], 65 | 7=>[2,11], 66 | 8=>[5,7], 67 | 9=>[5,7] 68 | ]; 69 | 70 | $taiji = array_merge($map[$tg[0]],$map[$tg[2]]);//日或年 71 | for($i = 0;$i<4;$i++){ 72 | if(in_array($dz[$i], $taiji)){ 73 | $star[$i][$key]=$value; 74 | } 75 | } 76 | } 77 | 78 | /** 79 | *天医:正月生见丑,二月生见寅,三月生见卯,四月生见辰,五月生见巳,六月生见午,七月生见未,八月生见申,九月生见酉,十月生见戌,十一月生见亥,十二月生见子。以月支查其它地支,见者为是 80 | */ 81 | public function tianYi2($info,&$star,$key,$value){ 82 | $dz = $info['dz']; 83 | $tg = $info['tg']; 84 | $tianyi = ($info['dz'][1]+12-1)%12;//以月份算,实现上面的口诀 85 | for($i = 0;$i<4;$i++){ 86 | if ($i == 1) {//不看月支 87 | continue; 88 | } 89 | if($tianyi == $dz[$i]){ 90 | $star[$i][$key]=$value; 91 | } 92 | } 93 | } 94 | /** 95 | * 天德 96 | *正月2生者见丁3,二月3生者见申8,三月4生者见壬8,四月生者见辛,五月生者见亥,六月生者见甲,七月生者见癸,八月生者见寅,九月生者见丙,十月生者见乙,十一月0生者见巳,十二月1生者见庚。 97 | */ 98 | public function tianDe($info,&$star,$key,$value){ 99 | $dz = $info['dz']; 100 | $tg = $info['tg']; 101 | //找不出什么规律 102 | $tiandeMap = [ 103 | 0=>[1,5],//1为地枝,子月对应为巳=>5 104 | 1=>[0,6],//0为天干,丑月对应为庚=>6 105 | 2=>[0,3],//丁 106 | 3=>[1,8],//申 107 | 4=>[0,8],//壬 108 | 5=>[0,7],//辛 109 | 6=>[1,11],//亥 110 | 7=>[0,0],//甲 111 | 8=>[0,9],//癸 112 | 9=>[1,2],//寅 113 | 10=>[0,2],//丙 114 | 11=>[0,1]//乙 115 | ] ; 116 | 117 | $tiande = $tiandeMap[$dz[1]]; 118 | if($tiande[0] == 0){ 119 | $check = $tg; 120 | }else{ 121 | $check = $dz; 122 | } 123 | for($i=0;$i<4;$i++){ 124 | if($check[$i] == $tiande[1]){ 125 | $star[$i][$key]=$value; 126 | } 127 | } 128 | } 129 | /** 130 | *月德贵人 131 | * 寅午戍月在辛7,申子辰月在丁3, 132 | * 亥卯未月在己5,巳酉丑月在乙1。 133 | */ 134 | function yueDe($info,&$star,$key,$value){ 135 | $tg = $info['tg']; 136 | $dz = $info['dz']; 137 | $map = [ 138 | 3,//子-丁 139 | 1,//丑-乙 140 | 7,//寅-辛 141 | 5,//卯-己 142 | 3, 143 | 1, 144 | 7, 145 | 5, 146 | 3, 147 | 1, 148 | 7, 149 | 5 150 | ]; 151 | $yuede = $map[$dz[1]]; 152 | for($i = 0;$i<4;$i++){ 153 | if($yuede == $tg[$i]){ 154 | $star[$i][$key]=$value; 155 | } 156 | } 157 | } 158 | 159 | 160 | 161 | /** 162 | * 禄神 163 | *甲禄在寅,乙禄在卯, 丙戊禄在巳,丁己禄在午,庚禄在申, 辛禄在酉,壬禄在亥,癸禄在子.以日查4枝 164 | */ 165 | 166 | public function lushen($info,&$star,$key,$value){ 167 | $tg = $info['tg']; 168 | $dz = $info['dz']; 169 | $map = [2,3,5,6,5,6,8,9,11,0]; 170 | $day = $tg[2]; 171 | $tmp = $map[$day]; 172 | for($i = 0;$i<4;$i++){ 173 | if($tmp == $dz[$i]){ 174 | $star[$i][$key]=$value; 175 | } 176 | } 177 | } 178 | 179 | /** 180 | * 羊刃:八字中,以日干:甲木见卯为羊刃;丙火、戊土见午为羊刃;庚金见酉为羊刃;壬水见子为羊刃,阴干没有羊刃 181 | */ 182 | public function yangRen($info,&$star,$key,$value){ 183 | $tg = $info['tg']; 184 | $dz = $info['dz']; 185 | $day = $tg[2]; 186 | $map = [ 187 | 0=>3, 188 | 2=>6, 189 | 4=>6, 190 | 6=>9, 191 | 8=>0 192 | ]; 193 | 194 | if(isset($map[$day])){ 195 | $tmp = $map[$day]; 196 | for($i = 0;$i<4;$i++){ 197 | if($tmp == $dz[$i]){ 198 | $star[$i][$key]=$value; 199 | } 200 | } 201 | } 202 | } 203 | 204 | /** 205 | * 孤鸾,日柱和时柱上只要同时出现以下干支组合中的任何两组,就会“命犯孤鸾”:乙巳、丁巳、辛亥、戊申、甲寅、戊午、壬子、丙午。 206 | * 207 | */ 208 | public function guLuan($info,&$star,$key,$value){ 209 | $tg = $info['tg']; 210 | $dz = $info['dz']; 211 | $map = [ 212 | '1-5',//乙巳 213 | '3-5',//丁巳 214 | '7-11',//辛亥 215 | '4-8',//戊申 216 | '0-2',//甲寅 217 | '4-6',//戊午 218 | '8-0',//壬子 219 | '2-6',//丙午 220 | ]; 221 | $day = $tg[2].'-'.$dz[2]; 222 | $hour= $tg[2].'-'.$dz[3]; 223 | if(in_array($day,$map) and \in_array($hour,$map)){ 224 | $star[2][$key] = $value; 225 | //$star[3][$key] = $value; 226 | } 227 | } 228 | 229 | /** 230 | * 三奇贵人,即奇门遁甲里的三奇 231 | * 天上三奇甲戊庚;地上三奇乙丙丁;人中三奇壬癸辛。三奇不管顺逆,只要连续三个天干相连,即可入格,重逢更贵。 232 | */ 233 | public function sanQi($info,&$star,$key,$value){ 234 | $tg = $info['tg']; 235 | $tg = implode('-',$tg); 236 | $map = [ 237 | '0-4-6',//甲戊庚 238 | '6-4-0', 239 | '1-2-3',//乙丙丁 240 | '3-2-1', 241 | '8-9-6',//壬癸辛 242 | '6-9-8' 243 | ]; 244 | foreach($map as $sanqi){ 245 | $v = strpos($tg,$sanqi); 246 | if($v === false){ 247 | continue; 248 | }else{ 249 | if($v==2){ 250 | $star[3][$key] = $value; 251 | }else{ 252 | $star[0][$key] = $value; 253 | } 254 | $star[1][$key] = $value; 255 | $star[2][$key]=$value; 256 | break; 257 | } 258 | } 259 | } 260 | /** 261 | * 天赦,寅卯辰月见戊寅日;巳午未月见甲午日;申酉戌月见戊申日;亥子丑月见甲子日,都是天赦。 262 | * 263 | */ 264 | 265 | public function tianXie($info,&$star,$key,$value){ 266 | $dz=$info['dz']; 267 | $tg = $info['tg']; 268 | $m = $info['dz']; 269 | if(\in_array($dz[1],[2,3,4])){///寅卯辰月 270 | if($tg[2] == 4 and $dz[2] == 2){ 271 | $star[2][$key] = $value; 272 | } 273 | }elseif(\in_array($dz[1],[5,6,7])){ 274 | if($tg[2] == 0 and $dz[2] == 6){ 275 | $star[2][$key] = $value; 276 | } 277 | }elseif(\in_array($dz[1],[8,9,10])){ 278 | if($tg[2] == 4 and $dz[2] == 8){ 279 | $star[2][$key] = $value; 280 | } 281 | 282 | }elseif(\in_array($dz[1],[11,0,1])){ 283 | if($tg[2] == 0 and $dz[2] == 0){ 284 | $star[2][$key] = $value; 285 | } 286 | } 287 | } 288 | 289 | /** 290 | * 德秀 : 291 | * 在寅月、午月、戌月出生的人,如果八字中天干见戊癸合,另外四柱中再有丙、丁其中之一者,为德秀贵人。 292 | * 在申月、子月、辰月出生的人,如果八字中天干见丙辛合、甲己合,另外四柱中再有壬、癸、戊、己其中之一者,为德秀贵人。 293 | * 在巳月、酉月、丑月出生的人,如果八字中天干有乙庚合,另外四柱中再有庚、辛其中之一者,为德秀贵人。 294 | * 在亥月、卯月、未月出生的人,如果八字中天干有丁壬合,另外四柱中再有甲、乙其中之一者,为德秀贵人。 295 | * 都是三合局的月 296 | */ 297 | public function deXiu($info,&$star,$key,$value){ 298 | $dz=$info['dz']; 299 | $tg = $info['tg']; 300 | //$de = $xiu = []; //德必须两个都要,秀只需要一个 301 | if(\in_array($dz[1],[2,6,10])){///寅午戌 302 | if(in_array(2,$tg) && in_array(3,$tg)){ 303 | $xiu = array_merge(array_keys($tg,2,false) , array_keys($tg,3,false)); 304 | } 305 | }elseif(\in_array($dz[1],[8,0,4])){//申子辰 306 | if((in_array(2,$tg) and in_array(7,$tg)) or (in_array(0,$tg) and in_array(5,$tg))){ 307 | $xiu = array_merge(array_keys($tg,8,false) , array_keys($tg,9,false),array_keys($tg,4,false),array_keys($tg,5,false)); 308 | } 309 | }elseif(\in_array($dz[1],[5,9,1])){//巳酉丑 310 | if(in_array(1,$tg) and in_array(6,$tg)){ 311 | $xiu = \array_key($tg,6,false); 312 | unset($xiu[0]); 313 | $xiu = array_merge($xiu,array_key($tg,7,false)); 314 | } 315 | }elseif(\in_array($dz[1],[11,3,7])){//亥卯未 316 | if(in_array(3,$tg) && in_array(8,$tg)){ 317 | $xiu = array_merge(array_keys($tg,0,false) , array_keys($tg,1,false)); 318 | } 319 | } 320 | if(isset($xiu)){ 321 | foreach($xiu as $i){ 322 | $star[$i][$key] = $value; 323 | } 324 | } 325 | 326 | } 327 | 328 | /** 329 | * 魁罡:壬辰,庚戍,庚辰,戊戍。日柱是这四组的话,就是命带魁罡了 330 | */ 331 | public function kuiGang($info,&$star,$key,$value){ 332 | $day = $info['tg'][2].'-'.$info['dz'][2]; 333 | $map = [ 334 | '8-4','7-10','7-4','4-10' 335 | ]; 336 | if(in_array($day,$map)){ 337 | $star[2][$key] = $value; 338 | } 339 | } 340 | 341 | /** 342 | * 金神,  343 | * 算法1:日柱是乙丑日、己巳日、癸酉日,月支有火星者方眞。否则须运逢火地才能富贵。 344 | * 算法2:时是乙丑时、己巳时、癸酉时,但必需日干甲或者己方是,否则非。又须月支见火星方眞, 否则须运逢火鄕方能富贵。 345 | * 346 | */ 347 | function jingShen($info,&$star,$key,$value){ 348 | $map = [ 349 | '1-1', 350 | '5-5', 351 | '8-8' 352 | ]; 353 | $fire = [ 354 | 2,//寅有丙火 355 | 5,//蛇有丙火 356 | 6,//马有丁火 357 | 7,//未有丁火 358 | 10//狗有丁火 359 | 360 | ]; 361 | $day = $info['tg'][2].'-'.$info['dz'][2]; 362 | if(in_array($day,$map)){ 363 | if(in_array($info['dz'][1],$fire)){ 364 | $value.= '(带火)'; 365 | }else{ 366 | $value.='(无火)'; 367 | } 368 | $star[2][$key] = $value; 369 | }else if(($info['tg'][2] == 0 or $info['tg'][2] == 1)){ 370 | $hour = $info['tg'][3].'-'.$info['dz'][3]; 371 | if(in_array($hour,$map)){ 372 | if(in_array($info['dz'][1],$fire)){ 373 | $value.= '(带火)'; 374 | }else{ 375 | $value.='(无火)'; 376 | } 377 | } 378 | $star[2][$key] = $value; 379 | } 380 | } 381 | 382 | /** 383 | * 天罗 384 | * ,年柱为戊子、己丑、丙寅、丁卯、甲辰、乙巳、戊午、己未、丙申、丁酉、甲戌、乙亥(纳音为火)的八字,而日支中又出现了戌或亥为天罗本文 385 | */ 386 | public function tianLuo($info,&$star,$key,$value){ 387 | if($info['dz'][2]==10 || $info['dz']==11){ 388 | $map = [ 389 | '4-0','5-1','2-2','3-3','0-4','1-5','4-6','5-7','2-8','3-9','0-10','1-11' 390 | ]; 391 | $year = $info['tg'][0].'-'.$info['dz'][0]; 392 | if(in_array($year,$map)){ 393 | $star[2][$key] = $value; 394 | } 395 | } 396 | } 397 | 398 | 399 | /** 400 | * 地网 401 | *年柱为丙子、丁丑、甲寅、乙卯、壬辰、癸巳、丙午、丁未、甲申、乙酉、壬戌、癸亥;庚子、辛丑、戊寅、己卯、丙辰、丁巳、庚午、辛未、戊申、己酉、丙戌、丁亥的八字,在日支当中又出现了辰或巳为地网 402 | */ 403 | public function diWang($info,&$star,$key,$value){ 404 | if($info['dz'][2]==4 || $info['dz']==5){ 405 | $map = [ 406 | '2-0','4-1','0-2','1-3','8-4','9-5','2-6','3-7','0-8','1-9','8-10','9-11', 407 | '6-0','7-1','4-2','5-3','2-4','3-5','7-6','8-7','4-8','5-9','2-10','3-11' 408 | ]; 409 | $year = $info['tg'][0].'-'.$info['dz'][0]; 410 | if(in_array($year,$map)){ 411 | $star[2][$key] = $value; 412 | } 413 | } 414 | } 415 | 416 | /** 417 | * 文昌,wenChang 418 | * 日干或者年干为甲,地支见巳者; 419 | * 日干或年干为乙,地支见午者; 420 | * 日干或年干为为丙,地支见申者; 421 | * 日干或年干为丁,地支见酉者; 422 | * 日干或年干为戊,地支见申者; 423 | * 日干或年干为己,地支见酉者; 424 | * 日干或年干为庚,地支见亥者; 425 | * 日干或年干为辛,地支见子者; 426 | * 日干或年干为壬,地支见寅者; 427 | * 日干或年干为癸,地支见卯者。以上皆为文昌贵人 428 | */ 429 | 430 | public function wenChang($info,&$star,$key,$value){ 431 | $tg = $info['tg']; 432 | $dz = $info['dz']; 433 | $find = false; 434 | if($tg[2] == 0 or $tg[0] == 0 ){ 435 | $find = 5; 436 | }elseif($tg[2] == 1 or $tg[0] == 1 ){ 437 | $find=6; 438 | }elseif($tg[2] == 2 or $tg[0] == 2 ){ 439 | $find=8; 440 | }elseif($tg[2] == 3 or $tg[0] == 3 ){ 441 | $find = 9; 442 | }elseif($tg[2] == 4 or $tg[0] == 4 ){ 443 | $find = 8; 444 | }elseif($tg[2] == 5 or $tg[0] == 5 ){ 445 | $find = 9; 446 | }elseif($tg[2] == 6 or $tg[0] == 6 ){ 447 | $find=11; 448 | }elseif($tg[2] == 7 or $tg[0] == 7 ){ 449 | $find = 0; 450 | }elseif($tg[2] == 8 or $tg[0] == 8 ){ 451 | $find = 2; 452 | }elseif($tg[2] == 9 or $tg[0] == 9 ){ 453 | $find = 3; 454 | } 455 | if($find !== false){ 456 | for($i = 0;$i<4;$i++){ 457 | if($dz[$i] == $find){ 458 | $star[$i][$key] = $value; 459 | } 460 | } 461 | } 462 | } 463 | 464 | /** 465 | * 金舆 466 | * 甲龙乙蛇丙戊羊,丁己猴歌庚犬方,辛猪壬牛癸逢虎,凡人遇此福气昌,以日干为主,四支见者为是。 467 | */ 468 | public function jinYu($info,&$star,$key,$value){ 469 | $dz = $info['dz']; 470 | $find = false; 471 | switch($info['tg'][2]){ 472 | case 0: 473 | $find=4;break; 474 | case 1: 475 | $find=5;break; 476 | case 2: 477 | $find=7;break; 478 | case 3: 479 | $find=8;break; 480 | case 4: 481 | $find=7;break; 482 | case 5: 483 | $find=8;break; 484 | case 6: 485 | $find=10;break; 486 | case 7: 487 | $find = 11;break; 488 | case 8: 489 | $find=1;break; 490 | case 9: 491 | $find = 2;break; 492 | } 493 | 494 | if($find !== false){ 495 | for($i = 0;$i<4;$i++){ 496 | if($dz[$i] == $find){ 497 | $star[$i][$key] = $value; 498 | } 499 | } 500 | } 501 | } 502 | 503 | /** 504 | * 福星:凡甲、丙两干见寅或子,乙、癸两干见卯或丑,戊干见申,己干见未,丁干见亥,庚干见午,辛干见巳,壬干见辰是也。年或日 505 | * 506 | */ 507 | public function fuXing($info,&$star,$key,$value){ 508 | $tg = $info['tg']; 509 | $dz = $info['dz']; 510 | $find =[]; 511 | if($tg[2] == 0 or $tg[0] == 0 or $tg[2]==2 or $tg[0]==2){ 512 | $find = [0,2]; 513 | } 514 | if($tg[2] == 1 or $tg[0] == 1 or $tg[2]==9 or $tg[0]==9 ){ 515 | $find[] = 3;$find[] = 1; 516 | } 517 | if($tg[2] == 4 or $tg[0] == 4 ){ 518 | $find[] =8; 519 | } 520 | if($tg[2] == 5 or $tg[0] == 5 ){ 521 | $find[]=7; 522 | } 523 | if($tg[2] == 3 or $tg[0] == 3 ){ 524 | $find[] = 11; 525 | } 526 | if($tg[2] == 6 or $tg[0] == 6 ){ 527 | $find=[6]; 528 | } 529 | if($tg[2] == 7 or $tg[0] == 7 ){ 530 | $find=[5]; 531 | } 532 | if($tg[2] == 8 or $tg[0] == 8 ){ 533 | $find=[4]; 534 | } 535 | if(count($find)){ 536 | for($i = 0;$i<4;$i++){ 537 | if(in_array($dz[$i],$find)){ 538 | $star[$i][$key] = $value; 539 | } 540 | } 541 | } 542 | } 543 | 544 | /** 545 | * 国印:甲见戌, 乙见亥, 丙见丑, 丁见寅,戊见丑, 己见寅, 庚见辰, 辛见巳,壬见未, 癸见申 以年干或日干为主, 地支见者为是 546 | * 547 | */ 548 | function guoYin($info,&$star,$key,$value){ 549 | $tg = $info['tg']; 550 | $dz = $info['dz']; 551 | $find=[]; 552 | switch($tg[0]){ 553 | case 0 : 554 | $find[]=10;break; 555 | case 1 : 556 | $find[]=11;break; 557 | case 2 : 558 | $find[] = 1;break; 559 | case 3 : 560 | $find[] = 2;break; 561 | case 4 : 562 | $find[] = 1;break; 563 | case 5 : 564 | $find[] = 2;break; 565 | case 6 : 566 | $find[] = 4;break; 567 | case 7 : 568 | $find[] = 5;break; 569 | case 8 : 570 | $find[] = 7;break; 571 | case 9 : 572 | $find[] = 8;break; 573 | } 574 | switch($tg[2]){ 575 | case 0 : 576 | $find[]=10;break; 577 | case 1 : 578 | $find[]=11;break; 579 | case 2 : 580 | $find[] = 1;break; 581 | case 3 : 582 | $find[] = 2;break; 583 | case 4 : 584 | $find[] = 1;break; 585 | case 5 : 586 | $find[] = 2;break; 587 | case 6 : 588 | $find[] = 4;break; 589 | case 7 : 590 | $find[] = 5;break; 591 | case 8 : 592 | $find[] = 7;break; 593 | case 9 : 594 | $find[] = 8;break; 595 | } 596 | 597 | for($i = 0;$i<4;$i++){ 598 | if(in_array($dz[$i],$find)){ 599 | $star[$i][$key] = $value; 600 | } 601 | } 602 | 603 | } 604 | 605 | /** 606 | * 天厨,凡甲干见巳,乙干见午,丙干见子,丁干见已,戊干见午,己干见申,庚干见寅,辛干见午,壬干见酉,癸干见亥。 607 | */ 608 | function tianChu($info,&$star,$key,$value){ 609 | $tg = $info['tg']; 610 | $dz = $info['dz']; 611 | $find=[]; 612 | switch($tg[0]){ 613 | case 0 : 614 | $find[]=5;break; 615 | case 1 : 616 | $find[]=6;break; 617 | case 2 : 618 | $find[] = 0;break; 619 | case 3 : 620 | $find[] = 5;break; 621 | case 4 : 622 | $find[] = 6;break; 623 | case 5 : 624 | $find[] = 8;break; 625 | case 6 : 626 | $find[] = 2;break; 627 | case 7 : 628 | $find[] = 6;break; 629 | case 8 : 630 | $find[] = 9;break; 631 | case 9 : 632 | $find[] = 11;break; 633 | } 634 | switch($tg[2]){ 635 | case 0 : 636 | $find[]=5;break; 637 | case 1 : 638 | $find[]=6;break; 639 | case 2 : 640 | $find[] = 0;break; 641 | case 3 : 642 | $find[] = 5;break; 643 | case 4 : 644 | $find[] = 6;break; 645 | case 5 : 646 | $find[] = 8;break; 647 | case 6 : 648 | $find[] = 2;break; 649 | case 7 : 650 | $find[] = 6;break; 651 | case 8 : 652 | $find[] = 9;break; 653 | case 9 : 654 | $find[] = 11;break; 655 | } 656 | for($i = 0;$i<4;$i++){ 657 | if(in_array($dz[$i],$find)){ 658 | $star[$i][$key] = $value; 659 | } 660 | } 661 | 662 | } 663 | 664 | /** 665 | * 学堂 666 | *年纳音为木,月日时支见亥,; 667 | *年纳音为火,月日时支见寅; 668 | *年纳音为土,月日时支见申; 669 | *年纳音为金,月日时支见巳; 670 | *年纳音为水,月日时支见申 671 | */ 672 | function xueTang($info,&$star,$key,$value){ 673 | $tg = $info['tg']; 674 | $dz = $info['dz']; 675 | $naYin = $info['na_yin'][0]; 676 | switch($naYin[1]){ 677 | case 0: 678 | $find = 11;break; 679 | case 1: 680 | $find = 2;break; 681 | case 2: 682 | $find = 8;break; 683 | case 3: 684 | $find = 5;break; 685 | case 4: 686 | $find = 8;break; 687 | } 688 | for($i = 0;$i<4;$i++){ 689 | if($i == 0 ){ 690 | continue; 691 | } 692 | if($dz[$i]==$find){ 693 | $star[$i][$key] = $value; 694 | } 695 | } 696 | } 697 | 698 | /** 699 | * ['hongYang(','红艳'], 700 | *日天干是甲,地支见午; 701 | *日天干是乙,地支见申; 702 | *日天干是丙,地支见寅; 703 | *日天干是丁,地支见未; 704 | *日天干是戊,地支见辰; 705 | *日天干是己,地支见辰; 706 | *日天干是庚,地支见戌; 707 | *日天干是辛,地支见酉; 708 | *日天干是壬,地支见子; 709 | *日天干是癸,地支见申。 710 | */ 711 | function hongYang($info,&$star,$key,$value){ 712 | $dz = $info['dz']; 713 | switch ($info['tg'][2]) { 714 | case 0: 715 | $find = 6;break; 716 | case 1: 717 | $find = 8;break; 718 | case 2: 719 | $find = 2;break; 720 | case 3: 721 | $find = 7;break; 722 | case 4: 723 | $find = 4;break; 724 | case 5: 725 | $find = 4;break; 726 | case 6: 727 | $find = 10;break; 728 | case 7: 729 | $find = 9;break; 730 | case 8: 731 | $find = 0;break; 732 | case 9: 733 | $find = 8;break; 734 | } 735 | for($i = 0;$i<4;$i++){ 736 | if($dz[$i]==$find){ 737 | $star[$i][$key] = $value; 738 | } 739 | } 740 | } 741 | 742 | /** 743 | * 流霞 744 | * 甲日酉、乙日戌、丙日未、丁日申、戊日巳;己日午、庚日辰、辛日卯、壬日亥、癸日寅 745 | */ 746 | public function liuXia($info,&$star,$key,$value){ 747 | $dz = $info['dz']; 748 | switch ($info['tg'][2]) { 749 | case 0: 750 | $find = 9;break; 751 | case 1: 752 | $find = 10;break; 753 | case 2: 754 | $find = 7;break; 755 | case 3: 756 | $find = 8;break; 757 | case 4: 758 | $find = 5;break; 759 | case 5: 760 | $find = 6;break; 761 | case 6: 762 | $find = 4;break; 763 | case 7: 764 | $find = 3;break; 765 | case 8: 766 | $find = 11;break; 767 | case 9: 768 | $find = 2;break; 769 | } 770 | for($i = 0;$i<4;$i++){ 771 | if($dz[$i]==$find){ 772 | $star[$i][$key] = $value; 773 | } 774 | } 775 | } 776 | 777 | /**将星,三合局里的中间 778 | * 寅午戌见午,申子辰见子,巳酉丑见酉,亥卯未见卯,只有3,6,9 779 | */ 780 | public function jiangXing($info,&$star,$key,$value){ 781 | $dz = $info['dz']; 782 | $day = $info['dz'][2]; 783 | $year = $info['dz'][0]; 784 | $map = [ 785 | 0,9,6,3,0,9,6,3,0,9,6,3 786 | ]; 787 | for($i = 0;$i<4;$i++){ 788 | if($i !== 2 ){ 789 | if($dz[$i] == $map[$day]){ 790 | $star[$i][$key] = $value; 791 | } 792 | } 793 | if($i !== 0){ 794 | if($dz[$i] == $map[$year]){ 795 | $star[$i][$key] = $value; 796 | } 797 | } 798 | 799 | } 800 | 801 | } 802 | 803 | /** 804 | * 华盖 三合局里最后一个 805 | * 寅午戌 申子辰 巳酉丑 亥卯未 806 | */ 807 | public function huaGai($info,&$star,$key,$value){ 808 | $dz = $info['dz']; 809 | $day = $info['dz'][2]; 810 | $year = $info['dz'][0]; 811 | $map = [ 812 | 4,1,10,7,4,1,10,7,4,1,10,7 813 | ]; 814 | for($i = 0;$i<4;$i++){ 815 | if($i !== 2 ){ 816 | if($dz[$i] == $map[$day]){ 817 | $star[$i][$key] = $value; 818 | } 819 | } 820 | if($i !== 0){ 821 | if($dz[$i] == $map[$year]){ 822 | $star[$i][$key] = $value; 823 | } 824 | } 825 | 826 | } 827 | } 828 | 829 | /** 830 | * 驿马 申子辰马在寅,寅午戌马在申,巳酉丑马在亥,亥卯未马在巳。 831 | */ 832 | public function yiMa($info,&$star,$key,$value){ 833 | $dz = $info['dz']; 834 | $day = $info['dz'][2]; 835 | $year = $info['dz'][0]; 836 | $map = [ 837 | 2,11,8,5,2,11,8,5,2,11,8,5 838 | ]; 839 | for($i = 0;$i<4;$i++){ 840 | if($i !== 2 ){ 841 | if($dz[$i] == $map[$day]){ 842 | $star[$i][$key] = $value; 843 | } 844 | } 845 | if($i !== 0){ 846 | if($dz[$i] == $map[$year]){ 847 | $star[$i][$key] = $value; 848 | } 849 | } 850 | 851 | } 852 | } 853 | /** 854 | * 劫 jieSha,克三合局的属性 855 | * 以年支或日支为主,其他地支见者为是。申子辰见巳,亥卯未见申,寅午戌见亥,巳酉丑见寅。 856 | */ 857 | public function jieSha($info,&$star,$key,$value){ 858 | $dz = $info['dz']; 859 | $day = $info['dz'][2]; 860 | $year = $info['dz'][0]; 861 | $map = [ 862 | 5,2,11,8,5,2,10,8,5,2,11,8 863 | ]; 864 | for($i = 0;$i<4;$i++){ 865 | if($i !== 2 ){ 866 | if($dz[$i] == $map[$day]){ 867 | $star[$i][$key] = $value; 868 | } 869 | } 870 | if($i !== 0){ 871 | if($dz[$i] == $map[$year]){ 872 | $star[$i][$key] = $value; 873 | } 874 | } 875 | 876 | } 877 | } 878 | /** 879 | * 亡神 880 | * 申子辰以11,寅午戌以5,巳酉丑以8,亥卯未以2 881 | * 882 | */ 883 | function wangShen($info,&$star,$key,$value){ 884 | $dz = $info['dz']; 885 | $day = $info['dz'][2]; 886 | $year = $info['dz'][0]; 887 | $map = [ 888 | 11,8,5,2,11,8,5,2,11,8,5,2 889 | ]; 890 | for($i = 0;$i<4;$i++){ 891 | if($i !== 2 ){ 892 | if($dz[$i] == $map[$day]){ 893 | $star[$i][$key] = $value; 894 | } 895 | } 896 | if($i !== 0){ 897 | if($dz[$i] == $map[$year]){ 898 | $star[$i][$key] = $value; 899 | } 900 | } 901 | 902 | } 903 | } 904 | 905 | /** 906 | * ['yuanChen','元辰(大耗)'], 907 | * 地支六冲前后,根据性别和年的阴阳决定是前还是后 908 | * 909 | */ 910 | public function yuanChen($info,&$star,$key,$value){ 911 | $dz = $info['dz']; 912 | $chong = $dz[0]+6; 913 | $shunxu = $dz[0]+$info['sex']%2; 914 | if($shunxu == 0){ 915 | $target = $chong-1; 916 | }else{ 917 | $target = $chong+1; 918 | } 919 | for($i = 0;$i<4;$i++){ 920 | if($i !== 0){ 921 | if($dz[$i] == $target){ 922 | $star[$i][$key] = $value; 923 | } 924 | } 925 | } 926 | } 927 | /** 928 | * ['guChen','孤辰'],, 929 | * 子年寅、丑年寅、寅年巳、卯年巳、辰年巳、巳年申、午年申、未年申、申年亥、酉年亥、戌年亥、亥年寅 930 | * 931 | */ 932 | public function guChen($info,&$star,$key,$value){ 933 | $dz = $info['dz']; 934 | $map = [ 935 | 2,2,5,5,5,8,8,8,11,11,11,2 936 | ]; 937 | $target = $map[$dz[0]]; 938 | for($i=0; $i<4; $i++){ 939 | if($i==0){ 940 | continue; 941 | } 942 | if($dz[$i] == $target){ 943 | $star[$i][$key] = $value; 944 | } 945 | } 946 | } 947 | 948 | /** 949 | * 寡宿 950 | * 子年、丑年、亥年 见戌10 命带寡宿 年支为寅卯辰见丑1为寡。巳午未的见辰4为寡。申酉戌的在它支见未7为命带寡宿。 951 | */ 952 | public function guaSu($info,&$star,$key,$value){ 953 | $dz = $info['dz']; 954 | $map = [ 955 | 10,10,1,1,1,4,4,4,7,7,7,10 956 | ]; 957 | $target = $map[$dz[0]]; 958 | for($i=0; $i<4; $i++){ 959 | if($i==0){ 960 | continue; 961 | } 962 | if($dz[$i] == $target){ 963 | $star[$i][$key] = $value; 964 | } 965 | } 966 | } 967 | 968 | /** 969 | * 灾煞,将星相冲 970 | * 申子辰见午6, 亥卯未见酉9, 寅午戌见子0, 巳酉丑见卯3,以年支为主, 四柱地支中见之者为是 971 | */ 972 | public function zhaiSha($info,&$star,$key,$value){ 973 | $dz = $info['dz']; 974 | $year = $info['dz'][0]; 975 | $map = [6,3,0,9,6,3,0,9,6,3,0,9]; 976 | for($i=0;$i<4;$i++){ 977 | if($i == 0){ 978 | continue; 979 | } 980 | if($dz[$i] == $map[$year]){ 981 | $star[$i][$key] = $value; 982 | } 983 | } 984 | 985 | } 986 | 987 | /** 988 | * ['liuE','六厄'],六厄为地支三合局之死地 989 | * 申子辰水局死地在卯3,寅午戌三合火局,死地在酉9;亥卯未三合木局,死地在午6;巳酉丑三合金局死地在子0 990 | */ 991 | function liuE($info,&$star,$key,$value){ 992 | $dz = $info['dz']; 993 | $year = $info['dz'][0]; 994 | $map = [3,0,9,6,3,0,9,6,3,0,9,6]; 995 | for($i=0;$i<4;$i++){ 996 | if($i == 0){ 997 | continue; 998 | } 999 | if($dz[$i] == $map[$year]){ 1000 | $star[$i][$key] = $value; 1001 | } 1002 | } 1003 | 1004 | } 1005 | 1006 | /** 1007 | * ['gouSha','勾煞'],勾煞和绞煞气一起 1008 | * 阳男阴女,命前三辰为勾,命后三辰为绞。 1009 | */ 1010 | 1011 | function gouSha($info,&$star,$key,$value){ 1012 | $dz = $info['dz']; 1013 | $hit = ($info['sex'] + $dz[0])%2; 1014 | if($hit == 0){ 1015 | $target = ($dz[0]+12-3)%12; 1016 | for($i=0;$i<4;$i++){ 1017 | if($i == 0){ 1018 | continue; 1019 | } 1020 | if($dz[$i] == $target){ 1021 | $star[$i][$key] = $value; 1022 | } 1023 | } 1024 | } 1025 | } 1026 | /** 1027 | * ['jiaoSha','绞煞'],勾煞和绞煞气一起 1028 | * 阳男阴女,命前三辰为勾,命后三辰为绞。 1029 | */ 1030 | 1031 | function jiaoSha($info,&$star,$key,$value){ 1032 | $dz = $info['dz']; 1033 | $hit = ($info['sex'] + $dz[0])%2; 1034 | if($hit == 0){ 1035 | $target = ($dz[0]+3)%12; 1036 | for($i=0;$i<4;$i++){ 1037 | if($i == 0){ 1038 | continue; 1039 | } 1040 | if($dz[$i] == $target){ 1041 | $star[$i][$key] = $value; 1042 | } 1043 | } 1044 | } 1045 | } 1046 | 1047 | /** 1048 | * 童子 1049 | * .命造生在春季或秋季的(以月令算),日支或时支见寅或子的; 1050 | * .命造生在冬季或夏季的(以月令算),日支或时支见卯未或辰的; 1051 | * .年柱纳音为金或木的,日支或时支见午或卯的。 1052 | * .年柱纳音为水或火的,日支或时支见酉或戌的。 1053 | * .年柱纳音为土命的,日支或时支见辰或巳的。 1054 | */ 1055 | function tongZi($info,&$star,$key,$value){ 1056 | $dz = $info['dz']; 1057 | $naYin = $info['na_yin'][0][1]; 1058 | $target = []; 1059 | if($dz[1] >1 and $dz[1]<=4 ){//春天 1060 | $target =[0,2]; 1061 | }elseif($dz[1] >4 and $dz[1]<=7 ){ 1062 | $target = [3,7,4]; 1063 | } 1064 | switch($naYin){ 1065 | case 0 : //木 1066 | case 3 : 1067 | $target[]=6; 1068 | $target[]=3; 1069 | break; 1070 | case 1 : 1071 | case 4 : 1072 | $target[]=9; 1073 | $target[]=10; 1074 | break; 1075 | case 3: 1076 | $target[]=4; 1077 | $target[]=5; 1078 | break; 1079 | } 1080 | for($i=0;$i<4;$i++){ 1081 | if($i = 0 || $i=1){ 1082 | continue; 1083 | } 1084 | if(in_array($dz[$i],$target)){ 1085 | $star[$i][$key] = $value; 1086 | } 1087 | } 1088 | 1089 | } 1090 | 1091 | /** 1092 | * 词馆,词馆者,如今官于翰林,谓之词馆,取其学业精专,文章出类。适合做作家,教授,学者 1093 | * 木命见寅,庚寅为正,火命见巳,乙巳为正,土命见巳,丁巳为正,金命见申,壬申为正,水命见亥,癸亥为正。 1094 | * 1095 | */ 1096 | function ciGuan($info,&$star,$key,$value){ 1097 | $tg = $info['tg']; 1098 | $dz = $info['dz']; 1099 | $naYin = $info['na_yin'][0]; 1100 | switch($naYin[1]){ 1101 | case 0: 1102 | $find = 2;break; 1103 | case 1: 1104 | $find = 5;break; 1105 | case 2: 1106 | $find = 5;break; 1107 | case 3: 1108 | $find = 8;break; 1109 | case 4: 1110 | $find = 11;break; 1111 | } 1112 | for($i = 0;$i<4;$i++){ 1113 | if($i == 0 ){ 1114 | continue; 1115 | } 1116 | if($dz[$i]==$find){ 1117 | $star[$i][$key] = $value; 1118 | } 1119 | } 1120 | } 1121 | 1122 | /** 1123 | * 红鸾 红鸾是神话传说中的红色仙鸟,命家所说的吉星,主婚配等喜事, 1124 | */ 1125 | public function hongLian($info,&$star,$key,$value){ 1126 | //$map = [3, 2,1,0,11,10,9,8,7,6,5,4]; 1127 | $dz = $info['dz']; 1128 | $find = (15-$dz[0])%12; 1129 | for($i = 0;$i<4;$i++){ 1130 | if($i == 0 ){ 1131 | continue; 1132 | } 1133 | if($dz[$i]==$find){ 1134 | $star[$i][$key] = $value; 1135 | } 1136 | } 1137 | } 1138 | 1139 | /** 1140 | * 天喜 1141 | */ 1142 | public function tianXi($info,&$star,$key,$value){ 1143 | //$map = [9,8,7,6,5,4,3,2,1,0,11,10]; 1144 | $dz = $info['dz']; 1145 | $find = (21-$dz[0])%12; 1146 | for($i = 0;$i<4;$i++){ 1147 | if($i == 0 ){ 1148 | continue; 1149 | } 1150 | if($dz[$i]==$find){ 1151 | $star[$i][$key] = $value; 1152 | } 1153 | } 1154 | } 1155 | /** 1156 | * 桃花,即子午卯酉 这4个正向(北,南,东,西) 1157 | * 亥卯未见子0、巳酉丑见午6、寅午戌见卯3、申子辰见酉9 1158 | */ 1159 | public function taoHua($info,&$star,$key,$value){ 1160 | $dz = $info['dz']; 1161 | $day = $info['dz'][2]; 1162 | $year = $info['dz'][0]; 1163 | $map = [ 1164 | 9,6,3,0,9,6,3,0,9,6,3,0 1165 | ]; 1166 | for($i = 0;$i<4;$i++){ 1167 | if($i !== 2 ){ 1168 | if($dz[$i] == $map[$day]){ 1169 | $star[$i][$key] = $value; 1170 | } 1171 | } 1172 | if($i !== 0){ 1173 | if($dz[$i] == $map[$year]){ 1174 | $star[$i][$key] = $value; 1175 | } 1176 | } 1177 | 1178 | } 1179 | } 1180 | /** 1181 | * 干禄 1182 | * 甲禄在寅,乙禄在卯,丙戊禄在巳,丁己禄在午,庚禄在申,辛禄在酉,壬祿在亥,癸禄在子。 1183 | */ 1184 | public function ganLu($info,&$star,$key,$value){ 1185 | $day = $info['tg'][2]; 1186 | $map = [2,3,5,6,8,9,11,0]; 1187 | $dz = $info['dz']; 1188 | $find = $map[$day]; 1189 | for($i = 0;$i<4;$i++){ 1190 | if($dz[$i] == $find){ 1191 | $star[$i][$key] = $value; 1192 | } 1193 | } 1194 | } 1195 | 1196 | /** 1197 | * 十灵 1198 | * 甲申、乙酉、丙子、丁丑、戊午、己丑、庚寅、辛卯、壬午、癸未日 1199 | */ 1200 | public function shiLing($info,&$star,$key,$value){ 1201 | $map = [ 1202 | '0-8','1-9','2-0','3-1','4-6','5-1','6-2','7-3','8-6','9-7' 1203 | ]; 1204 | $find = $info['tg'][2].'-'.$info['dz'][2]; 1205 | if(in_array($find,$map)){ 1206 | $star[2][$key] = $value; 1207 | } 1208 | } 1209 | 1210 | /** 1211 | * 十恶大败 主人花钱如流水,一生钱财难聚 1212 | * 甲辰 乙巳 丙申 丁亥 戊戌 己丑 庚辰 辛巳 壬申 癸亥 1213 | */ 1214 | public function shiE($info,&$star,$key,$value){ 1215 | $map = [ 1216 | '0-8','1-9','2-0','3-1','4-6','5-1','6-2','7-3','8-6','9-7' 1217 | ]; 1218 | $find = $info['tg'][2].'-'.$info['dz'][2]; 1219 | if(in_array($find,$map)){ 1220 | $star[2][$key] = $value; 1221 | } 1222 | } 1223 | 1224 | 1225 | 1226 | 1227 | } 1228 | 1229 | class Stars{ 1230 | /**星煞的序号及名字 1231 | * @var $star_name array 1232 | */ 1233 | 1234 | public $star_name = [ 1235 | ['kongWang','空亡'], 1236 | ['tianYi','天乙'], 1237 | ['taiJi','太极'], 1238 | ['tianYi2','天医'], 1239 | ['tianDe','天德'], 1240 | ['yueDe','月德'], 1241 | ['luShen','禄神'], 1242 | ['yangRen','羊刃'], 1243 | ['guLuan','孤鸾'], 1244 | ['sanQi','三奇'], 1245 | ['tianXie','天赦'], 1246 | ['deXiu','德秀'], 1247 | ['kuiGang','魁罡'], 1248 | ['jingShen','金神'], 1249 | ['tianLuo','天罗'], 1250 | ['diWang','地网'], 1251 | ['wenChang','文昌'], 1252 | ['jinYu','金舆'], 1253 | ['fuXing','福星'], 1254 | ['guoYin','国印'], 1255 | ['tianChu','天厨'], 1256 | ['xueTang','学堂'], 1257 | ['hongYang','红艳'], 1258 | ['liuXia','流霞'], 1259 | ['jiangXing','将星'], 1260 | ['huaGai','华盖'], 1261 | ['yiMa','驿马'], 1262 | ['jieSha','劫煞'], 1263 | ['wangShen','亡神'], 1264 | ['yuanChen','元辰(大耗)'], 1265 | ['guChen','孤辰'], 1266 | ['guaSu','寡宿'], 1267 | ['zhaiSha','灾煞'], 1268 | ['liuE','六厄'], 1269 | ['gouSha','勾煞'], 1270 | ['jiaoSha','绞煞'], 1271 | ['tongZi','童子'], 1272 | ['ciGuan','词馆'], 1273 | ['hongLian','红鸾'], 1274 | ['tianXi','天喜'], 1275 | ['taoHua','桃花'], 1276 | ['ganLu','干禄'], 1277 | ['shiLing','十灵'],//甲申、乙酉、丙子、丁丑、戊午、己丑、庚寅、辛卯、壬午、癸未日 1278 | ['shiE','十恶大败'], 1279 | ]; 1280 | 1281 | /** 1282 | * 1283 | */ 1284 | 1285 | private function getStars($info){ 1286 | $starChecker = new StarsCheck(); 1287 | $star = [[],[],[],[]];//年,月,日,时 1288 | foreach($this->star_name as $key=>$value){ 1289 | call_user_func_array( [$starChecker,$value[0]] , [$info,&$star,$key,$value] ); 1290 | } 1291 | $info['star'] = $star; 1292 | return $info; 1293 | } 1294 | 1295 | 1296 | /** 1297 | * 公历年排盘 1298 | * @param int $gd 0男1女 1299 | * @param int $yy 1300 | * @param int $mm 1301 | * @param int $dd 1302 | * @param int $hh 时间(0-23) 1303 | * @param int $mt 分钟数(0-59),在跨节的时辰上会需要,有的排盘忽略了跨节 1304 | * @param int $ss 秒数(0-59) 1305 | * @return array 1306 | */ 1307 | public function getInfo($gd, $yy, $mm, $dd, $hh, $mt=0, $ss=0){ 1308 | 1309 | $paiPan = new Paipan; 1310 | $info = $paiPan->getInfo($gd, $yy, $mm, $dd, $hh, $mt, $ss); 1311 | return $this->getStars($info); 1312 | 1313 | } 1314 | 1315 | 1316 | } 1317 | -------------------------------------------------------------------------------- /server/application/index/service/Paipan.php: -------------------------------------------------------------------------------- 1 | 8001){ 109 | return false; 110 | } 111 | if ($yy >= 1000 && $yy <= 8001) { 112 | $m = ($yy - 2000) / 1000; 113 | return 2451623.80984 + 365242.37404 * $m + 0.05169 * $m * $m - 0.00411 * $m * $m * $m - 0.00057 * $m * $m * $m * $m; 114 | } 115 | if ($yy >= -8000 && $yy < 1000) { 116 | $m = $yy / 1000; 117 | return 1721139.29189 + 365242.1374 * $m + 0.06134 * $m * $m + 0.00111 * $m * $m * $m - 0.00071 * $m * $m * $m * $m; 118 | } 119 | } 120 | /** 121 | * 地球在繞日运行時會因受到其他星球之影響而產生攝動(perturbation) 122 | * @param float $jd 123 | * @return number 返回某时刻(儒略日历)的攝動偏移量 124 | */ 125 | private function Perturbation($jd) { 126 | $t = ($jd - 2451545) / 36525; 127 | $s = 0; 128 | for ($k = 0; $k <= 23; $k++) { 129 | $s = $s + $this->ptsa[$k] * cos($this->ptsb[$k] * 2 * pi() / 360 + $this->ptsc[$k] * 2 * pi() / 360 * $t); 130 | } 131 | $w = 35999.373 * $t - 2.47; 132 | $l = 1 + 0.0334 * cos($w * 2 * pi() / 360) + 0.0007 * cos(2 * $w * 2 * pi() / 360); 133 | return 0.00001 * $s / $l; 134 | } 135 | /** 136 | * 求∆t 137 | * @param int $yy 年份 138 | * @param int $mm 月份 139 | * @return number 140 | */ 141 | private function DeltaT($yy, $mm) { 142 | 143 | $y = $yy + ($mm - 0.5) / 12; 144 | 145 | if ($y <= -500) { 146 | $u = ($y - 1820) / 100; 147 | $dt = ( - 20 + 32 * $u * $u); 148 | } else { 149 | if ($y < 500) { 150 | $u = $y / 100; 151 | $dt = (10583.6 - 1014.41 * $u + 33.78311 * $u * $u - 5.952053 * $u * $u * $u - 0.1798452 * $u * $u * $u * $u + 0.022174192 * $u * $u * $u * $u * $u + 0.0090316521 * $u * $u * $u * $u * $u * $u); 152 | } else { 153 | if ($y < 1600) { 154 | $u = ($y - 1000) / 100; 155 | $dt = (1574.2 - 556.01 * $u + 71.23472 * $u * $u + 0.319781 * $u * $u * $u - 0.8503463 * $u * $u * $u * $u - 0.005050998 * $u * $u * $u * $u * $u + 0.0083572073 * $u * $u * $u * $u * $u * $u); 156 | } else { 157 | if ($y < 1700) { 158 | $t = $y - 1600; 159 | $dt = (120 - 0.9808 * $t - 0.01532 * $t * $t + $t * $t * $t / 7129); 160 | } else { 161 | if ($y < 1800) { 162 | $t = $y - 1700; 163 | $dt = (8.83 + 0.1603 * $t - 0.0059285 * $t * $t + 0.00013336 * $t * $t * $t - $t * $t * $t * $t / 1174000); 164 | } else { 165 | if ($y < 1860) { 166 | $t = $y - 1800; 167 | $dt = (13.72 - 0.332447 * $t + 0.0068612 * $t * $t + 0.0041116 * $t * $t * $t - 0.00037436 * $t * $t * $t * $t + 0.0000121272 * $t * $t * $t * $t * $t - 0.0000001699 * $t * $t * $t * $t * $t * $t + 0.000000000875 * $t * $t * $t * $t * $t * $t * $t); 168 | } else { 169 | if ($y < 1900) { 170 | $t = $y - 1860; 171 | $dt = (7.62 + 0.5737 * $t - 0.251754 * $t * $t + 0.01680668 * $t * $t * $t - 0.0004473624 * $t * $t * $t * $t + $t * $t * $t * $t * $t / 233174); 172 | } else { 173 | if ($y < 1920) { 174 | $t = $y - 1900; 175 | $dt = ( - 2.79 + 1.494119 * $t - 0.0598939 * $t * $t + 0.0061966 * $t * $t * $t - 0.000197 * $t * $t * $t * $t); 176 | } else { 177 | if ($y < 1941) { 178 | $t = $y - 1920; 179 | $dt = (21.2 + 0.84493 * $t - 0.0761 * $t * $t + 0.0020936 * $t * $t * $t); 180 | } else { 181 | if ($y < 1961) { 182 | $t = $y - 1950; 183 | $dt = (29.07 + 0.407 * $t - $t * $t / 233 + $t * $t * $t / 2547); 184 | } else { 185 | if ($y < 1986) { 186 | $t = $y - 1975; 187 | $dt = (45.45 + 1.067 * $t - $t * $t / 260 - $t * $t * $t / 718); 188 | } else { 189 | if ($y < 2005) { 190 | $t = $y - 2000; 191 | $dt = (63.86 + 0.3345 * $t - 0.060374 * $t * $t + 0.0017275 * $t * $t * $t + 0.000651814 * $t * $t * $t * $t + 0.00002373599 * $t * $t * $t * $t * $t); 192 | } else { 193 | if ($y < 2050) { 194 | $t = $y - 2000; 195 | $dt = (62.92 + 0.32217 * $t + 0.005589 * $t * $t); 196 | } else { 197 | if ($y < 2150) { 198 | $u = ($y - 1820) / 100; 199 | $dt = ( - 20 + 32 * $u * $u - 0.5628 * (2150 - $y)); 200 | } else { 201 | $u = ($y - 1820) / 100; 202 | $dt = ( - 20 + 32 * $u * $u); 203 | } 204 | } 205 | } 206 | } 207 | } 208 | } 209 | } 210 | } 211 | } 212 | } 213 | } 214 | } 215 | } 216 | } 217 | 218 | if ($y < 1955 || $y >= 2005){ 219 | $dt = $dt - (0.000012932 * ($y - 1955) * ($y - 1955)); 220 | } 221 | return $dt / 60; //將秒轉換為分 222 | } 223 | /** 224 | * 获取指定年的春分开始的24节气,另外多取2个确保覆盖完一个公历年 225 | * 大致原理是:先用此方法得到理论值,再用摄动值(Perturbation)和固定参数DeltaT做调整 226 | * @param int $yy 227 | * @return boolean 228 | */ 229 | private function MeanJQJD($yy) { 230 | if(! $jd = $this->VE($yy)){ //该年的春分點 231 | return array(); 232 | } 233 | $ty = $this->VE($yy + 1) - $jd; //该年的回歸年長 234 | 235 | $num = 24 + 2; //另外多取2个确保覆盖完一个公历年 236 | 237 | $ath = 2 * pi() / 24; 238 | $tx = ($jd - 2451545) / 365250; 239 | $e = 0.0167086342 - 0.0004203654 * $tx - 0.0000126734 * $tx * $tx + 0.0000001444 * $tx * $tx * $tx - 0.0000000002 * $tx * $tx * $tx * $tx + 0.0000000003 * $tx * $tx * $tx * $tx * $tx; 240 | $tt = $yy / 1000; 241 | $vp = 111.25586939 - 17.0119934518333 * $tt - 0.044091890166673 * $tt * $tt - 4.37356166661345E-04 * $tt * $tt * $tt + 8.16716666602386E-06 * $tt * $tt * $tt * $tt; 242 | $rvp = $vp * 2 * pi() / 360; 243 | $peri = array(); 244 | for ($i = 0; $i < $num; $i++) { 245 | $flag = 0; 246 | $th = $ath * $i + $rvp; 247 | if ($th > pi() && $th <= 3 * pi()) { 248 | $th = 2 * pi() - $th; 249 | $flag = 1; 250 | } 251 | if ($th > 3 * pi()) { 252 | $th = 4 * pi() - $th; 253 | $flag = 2; 254 | } 255 | $f1 = 2 * atan((sqrt((1 - $e) / (1 + $e)) * tan($th / 2))); 256 | $f2 = ($e * sqrt(1 - $e * $e) * sin($th)) / (1 + $e * cos($th)); 257 | $f = ($f1 - $f2) * $ty / 2 / pi(); 258 | if ($flag == 1){ 259 | $f = $ty - $f; 260 | } 261 | if ($flag == 2){ 262 | $f = 2 * $ty - $f; 263 | } 264 | $peri[$i] = $f; 265 | } 266 | $jqjd = array(); 267 | for ($i = 0; $i < $num; $i++) { 268 | $jqjd[$i] = $jd + $peri[$i] - $peri[0]; 269 | } 270 | 271 | return (array)$jqjd; 272 | } 273 | /** 274 | * 获取指定年的春分开始作Perturbaton調整後的24节气,可以多取2个 275 | * @param int $yy 276 | * @param int $start 0-25 277 | * @param int $end 0-25 278 | * @return array 279 | */ 280 | private function GetAdjustedJQ($yy, $start, $end) { 281 | if($start<0 || $start>25){ 282 | return array(); 283 | } 284 | if($end<0 || $end>25){ 285 | return array(); 286 | } 287 | 288 | $jq = array(); 289 | 290 | $jqjd = $this->MeanJQJD($yy); //获取该年春分开始的24节气时间点 291 | foreach ($jqjd as $k => $jd){ 292 | if($k < $start){ 293 | continue; 294 | } 295 | if($k > $end){ 296 | continue; 297 | } 298 | $ptb = $this->Perturbation($jd); //取得受perturbation影響所需微調 299 | $dt = $this->DeltaT($yy, floor(($k+1) / 2) + 3); //修正dynamical time to Universal time 300 | $jq[$k] = $jd + $ptb - $dt / 60 / 24; //加上攝動調整值ptb,減去對應的Delta T值(分鐘轉換為日) 301 | $jq[$k] = $jq[$k] + 1 / 3; //因中國時間比格林威治時間先行8小時,即1/3日 302 | } 303 | return (array)$jq; 304 | } 305 | /** 306 | * 求出以某年立春點開始的節(注意:为了方便计算起运数,此处第0位为上一年的小寒) 307 | * @param int $yy 308 | * @return array jq[(2*$k+21)%24] 309 | */ 310 | private function GetPureJQsinceSpring($yy) { 311 | $jdpjq = array(); 312 | 313 | $dj = $this->GetAdjustedJQ($yy - 1, 19, 23); //求出含指定年立春開始之3個節氣JD值,以前一年的年值代入 314 | foreach ($dj as $k => $v){ 315 | if($k < 19){ 316 | continue; 317 | } 318 | if($k > 23){ 319 | continue; 320 | } 321 | if($k % 2 == 0){ 322 | continue; 323 | } 324 | $jdpjq[] = $dj[$k]; //19小寒;20大寒;21立春;22雨水;23惊蛰 325 | } 326 | 327 | $dj = $this->GetAdjustedJQ($yy, 0, 25); //求出指定年節氣之JD值,從春分開始,到大寒,多取两个确保覆盖一个公历年,也方便计算起运数 328 | foreach ($dj as $k => $v){ 329 | if($k % 2 == 0){ 330 | continue; 331 | } 332 | $jdpjq[] = $dj[$k]; 333 | } 334 | 335 | return (array)$jdpjq; 336 | } 337 | /** 338 | * 求出自冬至點為起點的連續15個中氣 339 | * @param int $yy 340 | * @return array jq[(2*$k+18)%24] 341 | */ 342 | private function GetZQsinceWinterSolstice($yy) { 343 | $jdzq = array(); 344 | 345 | $dj = $this->GetAdjustedJQ($yy - 1, 18, 23); //求出指定年冬至開始之節氣JD值,以前一年的值代入 346 | $jdzq[0] = $dj[18]; //冬至 347 | $jdzq[1] = $dj[20]; //大寒 348 | $jdzq[2] = $dj[22]; //雨水 349 | 350 | $dj = $this->GetAdjustedJQ($yy, 0, 23); //求出指定年節氣之JD值 351 | foreach ($dj as $k => $v){ 352 | if($k%2 != 0){ 353 | continue; 354 | } 355 | $jdzq[] = $dj[$k]; 356 | } 357 | 358 | return (array)$jdzq; 359 | } 360 | /** 361 | * 求出實際新月點 362 | * 以2000年初的第一個均值新月點為0點求出的均值新月點和其朔望月之序數 k 代入此副程式來求算實際新月點 363 | * @param unknown $k 364 | * @return number 365 | */ 366 | private function TrueNewMoon($k) { 367 | $jdt = 2451550.09765 + $k * $this->synmonth; 368 | $t = ($jdt - 2451545) / 36525; //2451545為2000年1月1日正午12時的JD 369 | $t2 = $t * $t; //square for frequent use 370 | $t3 = $t2 * $t; //cube for frequent use 371 | $t4 = $t3 * $t; //to the fourth 372 | //mean time of phase 373 | $pt = $jdt + 0.0001337 * $t2 - 0.00000015 * $t3 + 0.00000000073 * $t4; 374 | //Sun's mean anomaly(地球繞太阳运行均值近點角)(從太阳觀察) 375 | $m = 2.5534 + 29.10535669 * $k - 0.0000218 * $t2 - 0.00000011 * $t3; 376 | //Moon's mean anomaly(月球繞地球运行均值近點角)(從地球觀察) 377 | $mprime = 201.5643 + 385.81693528 * $k + 0.0107438 * $t2 + 0.00001239 * $t3 - 0.000000058 * $t4; 378 | //Moon's argument of latitude(月球的緯度參數) 379 | $f = 160.7108 + 390.67050274 * $k - 0.0016341 * $t2 - 0.00000227 * $t3 + 0.000000011 * $t4; 380 | //Longitude of the ascending node of the lunar orbit(月球繞日运行軌道升交點之經度) 381 | $omega = 124.7746 - 1.5637558 * $k + 0.0020691 * $t2 + 0.00000215 * $t3; 382 | //乘式因子 383 | $es = 1 - 0.002516 * $t - 0.0000074 * $t2; 384 | //因perturbation造成的偏移: 385 | $apt1 = -0.4072 * sin((pi() / 180) * $mprime); 386 | $apt1 += 0.17241 * $es * sin((pi() / 180) * $m); 387 | $apt1 += 0.01608 * sin((pi() / 180) * 2 * $mprime); 388 | $apt1 += 0.01039 * sin((pi() / 180) * 2 * $f); 389 | $apt1 += 0.00739 * $es * sin((pi() / 180) * ($mprime - $m)); 390 | $apt1 -= 0.00514 * $es * sin((pi() / 180) * ($mprime + $m)); 391 | $apt1 += 0.00208 * $es * $es * sin((pi() / 180) * (2 * $m)); 392 | $apt1 -= 0.00111 * sin((pi() / 180) * ($mprime - 2 * $f)); 393 | $apt1 -= 0.00057 * sin((pi() / 180) * ($mprime + 2 * $f)); 394 | $apt1 += 0.00056 * $es * sin((pi() / 180) * (2 * $mprime + $m)); 395 | $apt1 -= 0.00042 * sin((pi() / 180) * 3 * $mprime); 396 | $apt1 += 0.00042 * $es * sin((pi() / 180) * ($m + 2 * $f)); 397 | $apt1 += 0.00038 * $es * sin((pi() / 180) * ($m - 2 * $f)); 398 | $apt1 -= 0.00024 * $es * sin((pi() / 180) * (2 * $mprime - $m)); 399 | $apt1 -= 0.00017 * sin((pi() / 180) * $omega); 400 | $apt1 -= 0.00007 * sin((pi() / 180) * ($mprime + 2 * $m)); 401 | $apt1 += 0.00004 * sin((pi() / 180) * (2 * $mprime - 2 * $f)); 402 | $apt1 += 0.00004 * sin((pi() / 180) * (3 * $m)); 403 | $apt1 += 0.00003 * sin((pi() / 180) * ($mprime + $m - 2 * $f)); 404 | $apt1 += 0.00003 * sin((pi() / 180) * (2 * $mprime + 2 * $f)); 405 | $apt1 -= 0.00003 * sin((pi() / 180) * ($mprime + $m + 2 * $f)); 406 | $apt1 += 0.00003 * sin((pi() / 180) * ($mprime - $m + 2 * $f)); 407 | $apt1 -= 0.00002 * sin((pi() / 180) * ($mprime - $m - 2 * $f)); 408 | $apt1 -= 0.00002 * sin((pi() / 180) * (3 * $mprime + $m)); 409 | $apt1 += 0.00002 * sin((pi() / 180) * (4 * $mprime)); 410 | 411 | $apt2 = 0.000325 * sin((pi() / 180) * (299.77 + 0.107408 * $k - 0.009173 * $t2)); 412 | $apt2 += 0.000165 * sin((pi() / 180) * (251.88 + 0.016321 * $k)); 413 | $apt2 += 0.000164 * sin((pi() / 180) * (251.83 + 26.651886 * $k)); 414 | $apt2 += 0.000126 * sin((pi() / 180) * (349.42 + 36.412478 * $k)); 415 | $apt2 += 0.00011 * sin((pi() / 180) * (84.66 + 18.206239 * $k)); 416 | $apt2 += 0.000062 * sin((pi() / 180) * (141.74 + 53.303771 * $k)); 417 | $apt2 += 0.00006 * sin((pi() / 180) * (207.14 + 2.453732 * $k)); 418 | $apt2 += 0.000056 * sin((pi() / 180) * (154.84 + 7.30686 * $k)); 419 | $apt2 += 0.000047 * sin((pi() / 180) * (34.52 + 27.261239 * $k)); 420 | $apt2 += 0.000042 * sin((pi() / 180) * (207.19 + 0.121824 * $k)); 421 | $apt2 += 0.00004 * sin((pi() / 180) * (291.34 + 1.844379 * $k)); 422 | $apt2 += 0.000037 * sin((pi() / 180) * (161.72 + 24.198154 * $k)); 423 | $apt2 += 0.000035 * sin((pi() / 180) * (239.56 + 25.513099 * $k)); 424 | $apt2 += 0.000023 * sin((pi() / 180) * (331.55 + 3.592518 * $k)); 425 | return $pt + $apt1 + $apt2; 426 | } 427 | /** 428 | * 對於指定日期時刻所屬的朔望月,求出其均值新月點的月序數 429 | * @param float $jd 430 | * @return int 431 | */ 432 | private function MeanNewMoon($jd) { 433 | //$kn為從2000年1月6日14時20分36秒起至指定年月日之阴曆月數,以synodic month為單位 434 | $kn = floor(($jd - 2451550.09765) / $this->synmonth); //2451550.09765為2000年1月6日14時20分36秒之JD值. 435 | $jdt = 2451550.09765 + $kn * $this->synmonth; 436 | //Time in Julian centuries from 2000 January 0.5. 437 | $t = ($jdt - 2451545) / 36525; //以100年為單位,以2000年1月1日12時為0點 438 | $thejd = $jdt + 0.0001337 * $t * $t - 0.00000015 * $t * $t * $t + 0.00000000073 * $t * $t * $t * $t; 439 | //2451550.09765為2000年1月6日14時20分36秒,此為2000年後的第一個均值新月 440 | return array($kn, $thejd); 441 | } 442 | /** 443 | * 将儒略日历时间转换为公历(格里高利历)时间 444 | * @param float $jd 445 | * @return array(年,月,日,时,分,秒) 446 | */ 447 | private function Julian2Solar($jd) { 448 | $jd = (float)$jd; 449 | 450 | if ($jd >= 2299160.5) { //1582年10月15日,此日起是儒略日历,之前是儒略历 451 | $y4h = 146097; 452 | $init = 1721119.5; 453 | } else { 454 | $y4h = 146100; 455 | $init = 1721117.5; 456 | } 457 | $jdr = floor($jd - $init); 458 | $yh = $y4h / 4; 459 | $cen = floor(($jdr + 0.75) / $yh); 460 | $d = floor($jdr + 0.75 - $cen * $yh); 461 | $ywl = 1461 / 4; 462 | $jy = floor(($d + 0.75) / $ywl); 463 | $d = floor($d + 0.75 - $ywl * $jy + 1); 464 | $ml = 153 / 5; 465 | $mp = floor(($d - 0.5) / $ml); 466 | $d = floor(($d - 0.5) - 30.6 * $mp + 1); 467 | $y = (100 * $cen) + $jy; 468 | $m = ($mp + 2) % 12 + 1; 469 | if ($m < 3){ 470 | $y = $y + 1; 471 | } 472 | $sd = floor(($jd + 0.5 - floor($jd + 0.5)) * 24 * 60 * 60 + 0.00005); 473 | $mt = floor($sd / 60); 474 | $ss = $sd % 60; 475 | $hh = floor($mt / 60); 476 | $mt = $mt % 60; 477 | $yy = floor($y); 478 | $mm = floor($m); 479 | $dd = floor($d); 480 | 481 | return array($yy, $mm, $dd, $hh, $mt, $ss); 482 | } 483 | /** 484 | * 以比較日期法求算冬月及其餘各月名稱代碼,包含閏月,冬月為0,臘月為1,正月為2,餘類推.閏月多加0.5 485 | * @param int $yy 486 | */ 487 | private function GetZQandSMandLunarMonthCode($yy) { 488 | $mc = array(); 489 | 490 | $jdzq = $this->GetZQsinceWinterSolstice($yy); //取得以前一年冬至為起點之連續15個中氣 491 | $jdnm = $this->GetSMsinceWinterSolstice($yy, $jdzq[0]); //求出以含冬至中氣為阴曆11月(冬月)開始的連續16個朔望月的新月點 492 | $yz = 0; //設定旗標,0表示未遇到閏月,1表示已遇到閏月 493 | if (floor($jdzq[12] + 0.5) >= floor($jdnm[13] + 0.5)) { //若第13個中氣jdzq(12)大於或等於第14個新月jdnm(13) 494 | for ($i = 1; $i <= 14; $i++) { //表示此兩個冬至之間的11個中氣要放到12個朔望月中, 495 | //至少有一個朔望月不含中氣,第一個不含中氣的月即為閏月 496 | //若阴曆臘月起始日大於冬至中氣日,且阴曆正月起始日小於或等於大寒中氣日,則此月為閏月,其餘同理 497 | if (floor(($jdnm[$i] + 0.5) > floor($jdzq[$i - 1 - $yz] + 0.5) && floor($jdnm[$i + 1] + 0.5) <= floor($jdzq[$i - $yz] + 0.5))) { 498 | $mc[$i] = $i - 0.5; 499 | $yz = 1; //標示遇到閏月 500 | } else { 501 | $mc[$i] = $i - $yz; //遇到閏月開始,每個月號要減1 502 | } 503 | } 504 | } else { //否則表示兩個連續冬至之間只有11個整月,故無閏月 505 | for ($i = 0; $i <= 12; $i++) { //直接賦予這12個月月代碼 506 | $mc[$i] = $i; 507 | } 508 | for ($i = 13; $i <= 14; $i++) { //處理次一置月年的11月與12月,亦有可能含閏月 509 | //若次一阴曆臘月起始日大於附近的冬至中氣日,且阴曆正月起始日小於或等於大寒中氣日,則此月為閏月,次一正月同理. 510 | if (floor(($jdnm[$i] + 0.5) > floor($jdzq[$i - 1 - $yz] + 0.5) && floor($jdnm[$i + 1] + 0.5) <= floor($jdzq[$i - $yz] + 0.5))) { 511 | $mc[$i] = $i - 0.5; 512 | $yz = 1; //標示遇到閏月 513 | } else { 514 | $mc[$i] = $i - $yz; //遇到閏月開始,每個月號要減1 515 | } 516 | } 517 | } 518 | return array($jdzq, $jdnm, $mc); 519 | } 520 | /** 521 | * 求算以含冬至中氣為阴曆11月開始的連續16個朔望月 522 | * @param int $yy 年份 523 | * @param float $jdws 冬至的儒略日历时间 524 | * @return array 525 | */ 526 | private function GetSMsinceWinterSolstice($yy, $jdws) { 527 | $tjd = array(); 528 | $jd = $this->Solar2Julian($yy - 1, 11, 1, 0, 0, 0); //求年初前兩個月附近的新月點(即前一年的11月初) 529 | list($kn, $thejd) = $this->MeanNewMoon($jd); //求得自2000年1月起第kn個平均朔望日及其JD值 530 | for ($i = 0; $i <= 19; $i++) { //求出連續20個朔望月 531 | $k = $kn + $i; 532 | $mjd = $thejd + $this->synmonth * $i; 533 | $tjd[$i] = $this->TrueNewMoon($k) + 1 / 3; //以k值代入求瞬時朔望日,因中國比格林威治先行8小時,加1/3天 534 | //下式為修正dynamical time to Universal time 535 | $tjd[$i] = $tjd[$i] - $this->DeltaT($yy, $i - 1) / 1440; //1為1月,0為前一年12月,-1為前一年11月(當i=0時,i-1=-1,代表前一年11月) 536 | } 537 | for ($j = 0; $j <= 18; $j++) { 538 | if (floor($tjd[$j] + 0.5) > floor($jdws + 0.5)) { 539 | break; 540 | } //已超過冬至中氣(比較日期法) 541 | } 542 | 543 | $jdnm = array(); 544 | for ($k = 0; $k <= 15; $k++) { //取上一步的索引值 545 | $jdnm[$k] = $tjd[$j - 1 + $k]; //重排索引,使含冬至朔望月的索引為0 546 | } 547 | return (array)$jdnm; 548 | } 549 | /** 550 | * 將公历时间转换为儒略日历时间 551 | * @param int $yy 552 | * @param int $mm 553 | * @param int $dd 554 | * @param int $hh [0-23] 555 | * @param int $mt [0-59] 556 | * @param int $ss [0-59] 557 | * @return boolean|number 558 | */ 559 | private function Solar2Julian($yy, $mm, $dd, $hh=0, $mt=0, $ss=0) { 560 | if(! $this->ValidDate($yy, $mm, $dd)){ 561 | return false; 562 | } 563 | if($hh < 0 || $hh >= 24){ 564 | return false; 565 | } 566 | if($mt < 0 || $mt >= 60){ 567 | return false; 568 | } 569 | if($ss < 0 || $ss >= 60){ 570 | return false; 571 | } 572 | 573 | $yp = $yy + floor(($mm - 3) / 10); 574 | if (($yy > 1582) || ($yy == 1582 && $mm > 10) || ($yy == 1582 && $mm == 10 && $dd >= 15)) { //这一年有十天是不存在的 575 | $init = 1721119.5; 576 | $jdy = floor($yp * 365.25) - floor($yp / 100) + floor($yp / 400); 577 | } 578 | if (($yy < 1582) || ($yy == 1582 && $mm < 10) || ($yy == 1582 && $mm == 10 && $dd <= 4)) { 579 | $init = 1721117.5; 580 | $jdy = floor($yp * 365.25); 581 | } 582 | if(! $init){ 583 | return false; 584 | } 585 | $mp = floor($mm + 9) % 12; 586 | $jdm = $mp * 30 + floor(($mp + 1) * 34 / 57); 587 | $jdd = $dd - 1; 588 | $jdh = ($hh + ($mt + ($ss / 60))/60) / 24; 589 | return $jdy + $jdm + $jdd + $jdh + $init; 590 | } 591 | /** 592 | * 判断公历日期是否有效 593 | * @param int $yy 594 | * @param int $mm 595 | * @param int $dd 596 | * @return boolean 597 | */ 598 | public function ValidDate($yy, $mm, $dd) { 599 | if ($yy < -1000 || $yy > 3000) { //适用于西元-1000年至西元3000年,超出此范围误差较大 600 | return false; 601 | } 602 | 603 | if ($mm < 1 || $mm > 12) { //月份超出範圍 604 | return false; 605 | } 606 | 607 | if ($yy == 1582 && $mm == 10 && $dd >= 5 && $dd < 15) { //这段日期不存在.所以1582年10月只有20天 608 | return false; 609 | } 610 | 611 | $ndf1 = -($yy % 4 == 0); //可被四整除 612 | $ndf2 = (($yy % 400 == 0) - ($yy % 100 == 0)) && ($yy > 1582); 613 | $ndf = $ndf1 + $ndf2; 614 | $dom = 30 + ((abs($mm - 7.5) + 0.5) % 2) - intval($mm == 2) * (2 + $ndf); 615 | if ($dd <= 0 || $dd > $dom) { 616 | if ($ndf == 0 && $mm == 2 && $dd == 29) { //此年無閏月 617 | 618 | } else { //日期超出範圍 619 | 620 | } 621 | return false; 622 | } 623 | 624 | return true; 625 | } 626 | /** 627 | * 获取公历某个月有多少天 628 | * @param int $yy 629 | * @param int $mm 630 | * @return number 631 | */ 632 | public function GetSolarDays($yy, $mm){ 633 | if ($yy < -1000 || $yy > 3000) { //适用于西元-1000年至西元3000年,超出此范围误差较大 634 | return 0; 635 | } 636 | 637 | if ($mm < 1 || $mm > 12) { //月份超出範圍 638 | return 0; 639 | } 640 | $ndf1 = -($yy % 4 == 0); //可被四整除 641 | $ndf2 = (($yy % 400 == 0) - ($yy % 100 == 0)) && ($yy > 1582); 642 | $ndf = $ndf1 + $ndf2; 643 | return 30 + ((abs($mm - 7.5) + 0.5) % 2) - intval($mm == 2) * (2 + $ndf); 644 | } 645 | /** 646 | * 获取农历某个月有多少天 647 | * @param int $yy 648 | * @param int $mm 649 | * @param bool $isLeap 650 | * @return number 651 | */ 652 | public function GetLunarDays($yy, $mm, $isLeap){ 653 | if ($yy < -1000 || $yy > 3000) { //适用于西元-1000年至西元3000年,超出此范围误差较大 654 | return 0; 655 | } 656 | if ($mm < 1 || $mm > 12){ //輸入月份必須在1-12月之內 657 | return 0; 658 | } 659 | list($jdzq, $jdnm, $mc) = $this->GetZQandSMandLunarMonthCode($yy); 660 | 661 | $leap = 0; //若閏月旗標為0代表無閏月 662 | for ($j = 1; $j <= 14; $j++) { //確認指定年前一年11月開始各月是否閏月 663 | if ($mc[$j] - floor($mc[$j]) > 0) { //若是,則將此閏月代碼放入閏月旗標內 664 | $leap = floor($mc[$j] + 0.5); //leap=0對應阴曆11月,1對應阴曆12月,2對應阴曆隔年1月,依此類推. 665 | break; 666 | } 667 | } 668 | 669 | $mm = $mm + 2; //11月對應到1,12月對應到2,1月對應到3,2月對應到4,依此類推 670 | 671 | for ($i = 0; $i <= 14; $i++) { //求算阴曆各月之大小,大月30天,小月29天 672 | $nofd[$i] = floor($jdnm[$i + 1] + 0.5) - floor($jdnm[$i] + 0.5); //每月天數,加0.5是因JD以正午起算 673 | } 674 | 675 | $dy = 0; //当月天数 676 | $er = 0; //若輸入值有錯誤,er值將被設定為非0 677 | 678 | if ($isLeap){ //若是閏月 679 | if ($leap < 3) { //而旗標非閏月或非本年閏月,則表示此年不含閏月.leap=0代表無閏月,=1代表閏月為前一年的11月,=2代表閏月為前一年的12月 680 | $er = 1; //此年非閏年 681 | } else { //若本年內有閏月 682 | if ($leap != $mm) { //但不為輸入的月份 683 | $er = 2; //則此輸入的月份非閏月,此月非閏月 684 | } else { //若輸入的月份即為閏月 685 | $dy = $nofd[$mm]; 686 | } 687 | } 688 | } else { //若沒有勾選閏月則 689 | if ($leap == 0) { //若旗標非閏月,則表示此年不含閏月(包括前一年的11月起之月份) 690 | $dy = $nofd[$mm - 1]; 691 | } else { //若旗標為本年有閏月(包括前一年的11月起之月份) 公式nofd(mx - (mx > leap) - 1)的用意為:若指定月大於閏月,則索引用mx,否則索引用mx-1 692 | $dy = $nofd[$mm + ($mm > $leap) - 1]; 693 | } 694 | } 695 | return (int)$dy; 696 | } 697 | /** 698 | * 获取农历某年的闰月,0为无闰月 699 | * @param int $yy 700 | * @return number 701 | */ 702 | public function GetLeap($yy){ 703 | list($jdzq, $jdnm, $mc) = $this->GetZQandSMandLunarMonthCode($yy); 704 | 705 | $leap = 0; //若閏月旗標為0代表無閏月 706 | for ($j = 1; $j <= 14; $j++) { //確認指定年前一年11月開始各月是否閏月 707 | if ($mc[$j] - floor($mc[$j]) > 0) { //若是,則將此閏月代碼放入閏月旗標內 708 | $leap = floor($mc[$j] + 0.5); //leap=0對應阴曆11月,1對應阴曆12月,2對應阴曆隔年1月,依此類推. 709 | break; 710 | } 711 | } 712 | return max(0, $leap-2); 713 | } 714 | /** 715 | * 根据公历月日计算星座下标 716 | * @param int $mm 717 | * @param int $dd 718 | * @return int|false 719 | */ 720 | public function GetZodiac($mm, $dd) { 721 | if($mm < 1 || $mm > 12){ 722 | return false; 723 | } 724 | if($dd < 1 || $dd > 31){ 725 | return false; 726 | } 727 | 728 | $dds = array(20,19,21,20,21,22,23,23,23,24,22,22); //星座的起始日期 729 | 730 | $kn = $mm - 1; //下标从0开始 731 | 732 | if ($dd < $dds[$kn]){ //如果早于该星座起始日期,则往前一个 733 | $kn = (($kn + 12) - 1) % 12; //确保是正数 734 | } 735 | return (int)$kn; 736 | } 737 | /** 738 | * 计算公历的某天是星期几(PHP中的date方法,此处演示儒略日历的转换作用) 739 | * @param int $yy 740 | * @param int $mm 741 | * @param int $dd 742 | */ 743 | public function GetWeek($yy, $mm, $dd){ 744 | if(! $jd = $this->Solar2Julian($yy, $mm, $dd, 12)){ //当天12点计算(因为儒略日历是中午12点为起始点) 745 | return false; 746 | } 747 | 748 | return (((floor($jd+1) % 7)) + 7) % 7; //模數(或餘數)為0代表星期日(因为西元前4713年1月1日12時为星期一).jd加1是因起始日為星期一 749 | } 750 | /** 751 | * 将农历时间转换成公历时间 752 | * @param int $yy 753 | * @param int $mm 754 | * @param int $dd 755 | * @param int $isLeap 是否闰月 756 | * @return false/array(年,月,日) 757 | */ 758 | public function Lunar2Solar($yy, $mm, $dd, $isLeap) { 759 | if ($yy < -7000 || $yy > 7000) { //超出計算能力 760 | return false; 761 | } 762 | if ($yy < -1000 || $yy > 3000) { //适用于西元-1000年至西元3000年,超出此范围误差较大 763 | return false; 764 | } 765 | if ($mm < 1 || $mm > 12){ //輸入月份必須在1-12月之內 766 | return false; 767 | } 768 | if ($dd < 1 || $dd > 30) { //輸入日期必須在1-30日之內 769 | return false; 770 | } 771 | 772 | list($jdzq, $jdnm, $mc) = $this->GetZQandSMandLunarMonthCode($yy); 773 | 774 | $leap = 0; //若閏月旗標為0代表無閏月 775 | for ($j = 1; $j <= 14; $j++) { //確認指定年前一年11月開始各月是否閏月 776 | if ($mc[$j] - floor($mc[$j]) > 0) { //若是,則將此閏月代碼放入閏月旗標內 777 | $leap = floor($mc[$j] + 0.5); //leap=0對應阴曆11月,1對應阴曆12月,2對應阴曆隔年1月,依此類推. 778 | break; 779 | } 780 | } 781 | 782 | $mm = $mm + 2; //11月對應到1,12月對應到2,1月對應到3,2月對應到4,依此類推 783 | 784 | for ($i = 0; $i <= 14; $i++) { //求算阴曆各月之大小,大月30天,小月29天 785 | $nofd[$i] = floor($jdnm[$i + 1] + 0.5) - floor($jdnm[$i] + 0.5); //每月天數,加0.5是因JD以正午起算 786 | } 787 | 788 | $jd = 0; //儒略日历时间 789 | $er = 0; //若輸入值有錯誤,er值將被設定為非0 790 | 791 | if ($isLeap){ //若是閏月 792 | if ($leap < 3) { //而旗標非閏月或非本年閏月,則表示此年不含閏月.leap=0代表無閏月,=1代表閏月為前一年的11月,=2代表閏月為前一年的12月 793 | $er = 1; //此年非閏年 794 | } else { //若本年內有閏月 795 | if ($leap != $mm) { //但不為輸入的月份 796 | $er = 2; //則此輸入的月份非閏月,此月非閏月 797 | } else { //若輸入的月份即為閏月 798 | if ($dd <= $nofd[$mm]) { //若輸入的日期不大於當月的天數 799 | $jd = $jdnm[$mm] + $dd - 1; //則將當月之前的JD值加上日期之前的天數 800 | } else { //日期超出範圍 801 | $er = 3; 802 | } 803 | } 804 | } 805 | } else { //若沒有勾選閏月則 806 | if ($leap == 0) { //若旗標非閏月,則表示此年不含閏月(包括前一年的11月起之月份) 807 | if ($dd <= $nofd[$mm - 1]) { //若輸入的日期不大於當月的天數 808 | $jd = $jdnm[$mm - 1] + $dd - 1; //則將當月之前的JD值加上日期之前的天數 809 | } else { //日期超出範圍 810 | $er = 4; 811 | } 812 | } else { //若旗標為本年有閏月(包括前一年的11月起之月份) 公式nofd(mx - (mx > leap) - 1)的用意為:若指定月大於閏月,則索引用mx,否則索引用mx-1 813 | if ($dd <= $nofd[$mm + ($mm > $leap) - 1]) { //若輸入的日期不大於當月的天數 814 | $jd = $jdnm[$mm + ($mm > $leap) - 1] + $dd - 1; //則將當月之前的JD值加上日期之前的天數 815 | } else { //日期超出範圍 816 | $er = 4; 817 | } 818 | } 819 | } 820 | 821 | return $er ? false : array_slice($this->Julian2Solar($jd), 0, 3); 822 | } 823 | /** 824 | * 将公历时间转换成农历时间 825 | * @param int $yy 826 | * @param int $mm 827 | * @param int $dd 828 | * @return array(年,月,日,是否闰月) 829 | */ 830 | public function Solar2Lunar($yy, $mm, $dd) { 831 | if (! $this->ValidDate($yy, $mm, $dd)) { //驗證輸入日期的正確性 832 | return false; 833 | } 834 | 835 | $prev = 0; //是否跨年了,跨年了则减一 836 | $isLeap = 0;//是否闰月 837 | 838 | list($jdzq, $jdnm, $mc) = $this->GetZQandSMandLunarMonthCode($yy); 839 | 840 | $jd = $this->Solar2Julian($yy, $mm, $dd, 12, 0, 0); //求出指定年月日之JD值 841 | if (floor($jd) < floor($jdnm[0] + 0.5)) { 842 | $prev = 1; 843 | list($jdzq, $jdnm, $mc) = $this->GetZQandSMandLunarMonthCode($yy - 1); 844 | } 845 | for ($i = 0; $i <= 14; $i++) { //指令中加0.5是為了改為從0時算起而不從正午算起 846 | if (floor($jd) >= floor($jdnm[$i] + 0.5) && floor($jd) < floor($jdnm[$i + 1] + 0.5)) { 847 | $mi = $i; 848 | break; 849 | } 850 | } 851 | 852 | if ($mc[$mi] < 2 || $prev == 1) { //年 853 | $yy = $yy - 1; 854 | } 855 | 856 | if (($mc[$mi] - floor($mc[$mi])) * 2 + 1 != 1) { //因mc(mi)=0對應到前一年阴曆11月,mc(mi)=1對應到前一年阴曆12月,mc(mi)=2對應到本年1月,依此類推 857 | $isLeap = 1; 858 | } 859 | $mm = (floor($mc[$mi] + 10) % 12) + 1; //月 860 | 861 | $dd = floor($jd) - floor($jdnm[$mi] + 0.5) + 1; //日,此處加1是因為每月初一從1開始而非從0開始 862 | 863 | return array($yy, $mm, $dd, $isLeap); 864 | } 865 | /** 866 | * 求出含某公历年立春點開始的24节气 867 | * @param int $yy 868 | * @return array jq[($k+21)%24] 869 | */ 870 | public function Get24JieQi($yy) { 871 | 872 | $jq = array(); 873 | 874 | $dj = $this->GetAdjustedJQ($yy - 1, 21, 23); //求出含指定年立春開始之3個節氣JD值,以前一年的年值代入 875 | foreach ($dj as $k => $v){ 876 | if($k < 21){ 877 | continue; 878 | } 879 | if($k > 23){ 880 | continue; 881 | } 882 | $jq[] = $this->Julian2Solar($dj[$k]); //21立春;22雨水;23惊蛰 883 | } 884 | 885 | $dj = $this->GetAdjustedJQ($yy, 0, 20); //求出指定年節氣之JD值,從春分開始 886 | foreach ($dj as $k => $v){ 887 | $jq[] = $this->Julian2Solar($dj[$k]); 888 | } 889 | 890 | return (array)$jq; 891 | } 892 | /** 893 | * 四柱計算,分早子时晚子时,传公历 894 | * @param int $yy 895 | * @param int $mm 896 | * @param int $dd 897 | * @param int $hh 时间(0-23) 898 | * @param int $mt 分钟数(0-59),在跨节的时辰上会需要,有的排盘忽略了跨节 899 | * @param int $ss 秒数(0-59) 900 | * @return array(天干, 地支, 对应的儒略日历时间, 对应年的12节+前后N节, 对应时间所处节的索引) 901 | */ 902 | public function GetGanZhi($yy, $mm, $dd, $hh, $mt=0, $ss=0){ 903 | if(! $jd = $this->Solar2Julian($yy, $mm, $dd, $hh, $mt, max(1, $ss))){ //多加一秒避免精度问题 904 | return array(); 905 | } 906 | 907 | $tg = $dz = array(); 908 | 909 | $jq = $this->GetPureJQsinceSpring($yy); //取得自立春開始的节,该数组长度固定为16 910 | if ($jd < $jq[1]) { //jq[1]為立春,約在2月5日前後, 911 | $yy = $yy - 1; //若小於jq[1],則屬於前一個節氣年 912 | $jq = $this->GetPureJQsinceSpring($yy); //取得自立春開始的节 913 | } 914 | 915 | $ygz = (($yy + 4712 + 24) % 60 + 60) % 60; 916 | $tg[0] = $ygz % 10; //年干 917 | $dz[0] = $ygz % 12; //年支 918 | 919 | for ($j = 0; $j <= 15; $j++) { //比較求算節氣月,求出月干支 920 | if ($jq[$j] >= $jd) { //已超過指定時刻,故應取前一個節氣 921 | $ix = $j-1; 922 | break; 923 | } 924 | } 925 | 926 | $tmm = (($yy + 4712) * 12 + ($ix - 1) + 60) % 60; //数组0为前一年的小寒所以这里再减一 927 | $mgz = ($tmm + 50) % 60; 928 | $tg[1] = $mgz % 10; //月干 929 | $dz[1] = $mgz % 12; //月支 930 | 931 | $jda = $jd + 0.5; //計算日柱之干支,加0.5是將起始點從正午改為從0點開始. 932 | $thes = (($jda - floor($jda)) * 86400) + 3600; //將jd的小數部份化為秒,並加上起始點前移的一小時(3600秒),取其整數值 933 | $dayjd = floor($jda) + $thes / 86400; //將秒數化為日數,加回到jd的整數部份 934 | $dgz = (floor($dayjd + 49) % 60 + 60) % 60; 935 | $tg[2] = $dgz % 10; //日干 936 | $dz[2] = $dgz % 12; //日支 937 | if($this->zwz && ($hh >= 23)){ //区分早晚子时,日柱前移一柱 938 | $tg[2] = ($tg[2] + 10 - 1) % 10; 939 | $dz[2] = ($dz[2] + 12 - 1) % 12; 940 | } 941 | 942 | $dh = $dayjd * 12; //計算時柱之干支 943 | $hgz = (floor($dh + 48) % 60 + 60) % 60; 944 | $tg[3] = $hgz % 10; //時干 945 | $dz[3] = $hgz % 12; //時支 946 | 947 | return array($tg, $dz, $jd, $jq, $ix); 948 | } 949 | /** 950 | * 计算凶亡地支 951 | * @param int $day_tg_int 日天干索引序号 952 | * @param int $day_dz_int 日地支索引序号 953 | * @return array('index'=>[凶亡的地支的第一索引,凶亡的地支的第二索引,char=>凶亡对应字符]); 954 | */ 955 | private function GetXiongWang($day_tg_int,$day_dz_int){ 956 | $xw_start = $day_dz_int - $day_tg_int -2; 957 | if($xw_start<0){ 958 | $xw_start+=12; 959 | } 960 | if(12 == $xw_start){ 961 | $xw_start = 0; 962 | } 963 | $xw_end = $xw_start+1; 964 | if(12 == $xw_end){ 965 | $xw_end = 0; 966 | } 967 | return ['index'=>[$xw_start,$xw_end],'char'=>$this->cdz[$xw_start].$this->cdz[$xw_end]]; 968 | } 969 | /** 970 | * 计算十神 971 | * @param $day_tg_int 日天干索引序号 972 | * @param $other_tg_int 973 | * @return array('index'=>[第一层索引,第二层索引],'char'=>神煞的字) 974 | */ 975 | private function GetTenGod($day_tg_int,$other_tg_int){ 976 | $l2_index = ($day_tg_int+$other_tg_int)%2;//判断两者结合后是阴是阳,从而决定数组的第二层索引 977 | $day_wx = $this->GetTgWx($day_tg_int); 978 | $other_wx = $this->GetTgWx($other_tg_int); 979 | $l1_index = $other_wx - $day_wx; 980 | if($l1_index<0){ 981 | $l1_index += 5; 982 | } 983 | return ['index'=>[$l1_index,$l2_index],'char'=>$this->ten_god[$l1_index][$l2_index]]; 984 | } 985 | /** 986 | * 获取天干五行索引 987 | * @param int $tg 天干索引数字 988 | * @return int 五行索引 989 | */ 990 | public function GetTgWx($tg){ 991 | if($tg%2){ //如果不是偶数,减一变偶数,以判断 992 | $tg--; 993 | } 994 | return $tg/2; 995 | } 996 | /** 997 | * 获取三合的地支和属性,也适合用于半合(3和7除外,卯未为破不为合),其中第一个必须存在才能有半合或者三合第一为帝旺,第二为墓,第三为长生 998 | * @param int $dz 地支 999 | * @return ['sanhe'=>[三个int,对应地支,其中第一个必须存在才能合],'ju'=>'三合成的五行局序号,木火土金水'] 1000 | */ 1001 | public function getSanHe($dz){ 1002 | //0子旺,4辰墓,8申生 | 3卯,7未,11亥生 |6,10,2长生 | 9 1 5生 1003 | $fir = $dz%4*3; 1004 | $sec = ($fir+4)%12; 1005 | $thr = ($sec+4)%12; 1006 | $ju_array=[4,0,1,3]; 1007 | $ju = $ju_array[$fir/3]; 1008 | return ['sanhe'=>[$fir,$sec,$thr],'ju'=>$ju]; 1009 | } 1010 | 1011 | /** 1012 | * 获取某地支的相冲的地支 1013 | * @param int $dz 地支 1014 | * @return int 相冲地支 1015 | */ 1016 | public function getChong($dz){ 1017 | return ($dz+6)%12; 1018 | } 1019 | 1020 | /** 1021 | * 根据某一个地支,获取刑它的地支,刑是一种单向的制约关系,目前没找到啥数字规律 只能写map 1022 | * @param int $dz 地支数字 1023 | * @return int 刑它的地支; 1024 | */ 1025 | public function getXingFrom($dz){ 1026 | //子刑卯,卯刑子,为无理之刑; 1027 | //丑刑未,未刑戌,戌刑丑,为特势之刑 1028 | //寅刑巳,巳刑申,申刑寅,为无恩之刑; 1029 | //辰,酉,亥,午,为自刑; 1030 | $xing_map = [3,7,5,0,4,8,6,10,2,9,1,11]; 1031 | return $xing_map[$dz]; 1032 | } 1033 | 1034 | /** 1035 | * 天干相合的另外一个天干与合成的局,天干相合有条件 1036 | * 第一,必须是相邻的柱,否则不能相合, 1037 | * 1038 | * 1.甲己合化土。必须是在辰、巳、午、未、戌、丑六个月令地支时间内,才是甲己合化土。即:甲木的性质不复存在而变成了土的物质,当然己土还是土,表示土的力量增加,木的力量没有了。若四柱命理喜甲木而被己土合化,则人体胆经或头部有疾;若忌甲木,则己土来合化甲木代表人体健康的信息。 1039 | * 乙庚合化金。必须是在4辰、8申、9酉、10戌、1丑五个月令中,才是乙庚合化金。表示乙木的性质不复存在,金力加大。若四柱命理喜金,则人体健康;若忌金,则乙庚合化金,主人体肝经有疾。 1040 | *3.丙辛合化水。必须是在8申、9酉、11亥、0子、1丑五个月令中,才是丙辛合化水。表示丙火、辛金的性质都不复存在,水的力量增加。若四柱命理喜火喜金,则双双合化主人体小肠经、肺经有疾;若忌火金,则又是人体健康的信息。 1041 | *4.丁壬合化木。必须是在2寅、3卯、4辰、11亥、0子、1丑六个月令中,才是丁壬合化木。表示丁火、壬水的性质不复存在,木的力量加大。若四柱命理喜木,则是人体健康的标志;若是忌木,则人体心经、膀胱经有疾。 1042 | *5.戊癸合化火。必须是在2寅、3卯、4辰、5巳、6午、7未六个月令中,才是戊癸合化火。表示戊土、癸水的性质都不复存在,而火的力量加旺。若四柱命理喜火,则是人体健康的标志;若是忌火,则人体胃经、肾经有病。 1043 | * @param int $month_dz 月的地支数字 1044 | * @param int $tg 天干数字 1045 | * @return false/array(['he'=>[天干数字],'局'=>五行数字) 1046 | */ 1047 | function tgHe($month_dz,$tgA){ 1048 | if($tgA>11){ 1049 | return false; 1050 | } 1051 | if($tgA>=5){ 1052 | $tg_from = $tgA-5; 1053 | $tg_tag = $tgA; 1054 | }else{ 1055 | $tg_from = $tgA; 1056 | $tg_tag = $tgA + 5; 1057 | } 1058 | $map = [ 1059 | [1,4,5,6,7,10], 1060 | [4,8,9,10,1], 1061 | [8,9,11,0,1], 1062 | [2,3,4,11,0,1], 1063 | [2,3,4,5,6,7] 1064 | ]; 1065 | $ju_map = [2,3,4,0,1]; 1066 | $dz_must = $map[$tg_from]; 1067 | if(in_array($month_dz,$dz_must)){ 1068 | return ['he'=>[$tg_from,$tg_tag],'ju'=>$ju_map[$tg_from]]; 1069 | }else{ 1070 | return false; 1071 | } 1072 | } 1073 | 1074 | /** 1075 | * 六合 也叫暗合,2寅11亥合化木,0子1丑合化土,3卯10戍合化火,4辰9酉合化金,6午7未合化土,8申5巳合化水。 1076 | * @param int $dz 地支数字 1077 | * @return array [index=>与他暗合的地支数字,ju=>化为哪个五行局] 1078 | */ 1079 | function getLiuHe($dz){ 1080 | if($dz == 0){ 1081 | $tmp = 12; 1082 | }else{ 1083 | $tmp = $dz; 1084 | } 1085 | 1086 | $he = (13-$tmp)%12; 1087 | $hua = [2,2,0,1,3,4,2]; 1088 | if($dz<$he){ 1089 | //dump($dz); 1090 | $ju = $hua[$dz]; 1091 | }else{ 1092 | $ju = $hua[$he]; 1093 | } 1094 | return ['index'=>$he,'ju'=>$ju]; 1095 | } 1096 | 1097 | /** 1098 | * 获取六害的另外一个地支,也叫相穿,或者制,穿的杀伤力比冲厉害 1099 | * @param int $dz 地支 1100 | * @return int $相害的另外一个地支 1101 | */ 1102 | public function getChuan($dz){ 1103 | //0子7未、1丑6午、2寅5巳、3卯4辰、8申11亥、9酉10戌,前面特征是和为7,后面特征是和为19 1104 | return (19-$dz)%12; 1105 | } 1106 | 1107 | /** 1108 | * 获取相破的另外一个地支,地支相破:0子9酉、3卯6午、1丑4辰、7未10戌、2寅11亥、5巳8申等这六个地支在一个命局中相遇,即为相破。其中位于四个帝旺位的想破强力(即子午卯酉),其他力量很小。 1109 | * @param int $dz 地支 1110 | * @return int 相破的地支 1111 | */ 1112 | public function getPo($dz){ 1113 | $map = [9,4,11,6,1,8,6,10,5,0,2,11]; 1114 | return $map[$dz]; 1115 | } 1116 | 1117 | /** 1118 | * 计算十二长生 1119 | * @param int $tg 天干索引数字,一般排盘时候用日为主 1120 | * @param int $dz 地支索引数字 1121 | * @return array ('index'=>十二长生索引,'char'=>长生名字) 1122 | */ 1123 | public function GetCs($tg,$dz){ 1124 | $cs_dz_index = $this->cs_tg2dz[$tg];//长生所在地支 1125 | if(0 == $tg%2){//阳天干,正向取长生 1126 | $move_num = $dz - $cs_dz_index; 1127 | }else{ 1128 | $move_num = $cs_dz_index - $dz; 1129 | } 1130 | if($move_num<0){ 1131 | $move_num += 12; 1132 | } 1133 | $char = $this->cs[$move_num]; 1134 | 1135 | return ['index'=>$move_num,'char'=>$char]; 1136 | } 1137 | /** 1138 | * 计算命宫 1139 | * @param $year_tg 年天干索引数字 1140 | * @param $month_dz 月地支索引数字 1141 | * @param $hour_dz 时地支索引数字 1142 | * @return array (index=>[天干,地支索引],char=>宫名) 1143 | */ 1144 | private function GetGong($year_tg,$month_dz,$hour_dz){ 1145 | $gong_dz = (29 -$month_dz - $hour_dz)%12; 1146 | $gong_dz<2?$xi=1:$xi=0;//系数,由于从一月开始 子 丑 要算作 12 和 13 1147 | $gong_tg = (($year_tg%5)*2+$gong_dz+12*$xi)%10; 1148 | return ['index'=>[$gong_tg,$gong_dz],'char'=>$this->ctg[$gong_tg].$this->cdz[$gong_dz]]; 1149 | } 1150 | /** 1151 | * 计算北京时间属于哪个时辰,并划分 时头 时中 还是时尾 1152 | * @param $hh 时间的整数格式,如 1 或者 03 或者11 1153 | * @parm $ii 分钟的整数格式,如 0 或者 01 或者 22等 1154 | */ 1155 | public function GetCTPart($hh,$ii){ 1156 | $des = ['时头','时中','时尾']; 1157 | $hh = intval($hh); 1158 | $ii = intval($ii); 1159 | $shi_chen = intval(($hh+1)/2); 1160 | $part = 0; 1161 | if($hh%2){ 1162 | //如果$hh为单数,如23点,即为时辰的上部分 1163 | if($ii>40){ 1164 | $part = 1;//时中 1165 | } 1166 | }else{ 1167 | if($ii<20){ 1168 | $part = 1; 1169 | }else{ 1170 | $part = 2;//时尾 1171 | } 1172 | } 1173 | return ['index'=>[$shi_chen,$part],'char'=>$this->cdz[$shi_chen].$des[$part]]; 1174 | } 1175 | 1176 | /** 1177 | * 计算本气 1178 | * @param $tg 单个天干的数字 1179 | * @param $dz 单个地支的数字 1180 | * @return array/false [index=>本气序号,char=>本气名] 1181 | */ 1182 | public function getSelfQi($tg,$dz){ 1183 | $biao = [ 1184 | [2,3,5,6,5,6,8,9,11,0], 1185 | [3,null,6,null,7,null,9,null,0,null], 1186 | [11,11,2,2,2,2,4,4,8,8], 1187 | [7,7,10,10,10,4,1,1,4,4], 1188 | [4,4,7,7,null,null,10,10,1,1], 1189 | [6,6,9,9,9,9,0,0,3,3], 1190 | [8,8,11,11,11,11,2,2,5,5] 1191 | ]; 1192 | $index = false; 1193 | for($i = 0;$i<7;$i++){ 1194 | if($biao[$i][$tg] == $dz){ 1195 | $index = $i; 1196 | break; 1197 | } 1198 | } 1199 | if($index === false){ 1200 | return ['index'=>-1,'char'=>'--']; 1201 | }else{ 1202 | return ['index'=>$index,'char'=>$this->selfQi[$index]]; 1203 | } 1204 | } 1205 | /** 1206 | * 公历年排盘 1207 | * @param int $gd 0男1女 1208 | * @param int $yy 1209 | * @param int $mm 1210 | * @param int $dd 1211 | * @param int $hh 时间(0-23) 1212 | * @param int $mt 分钟数(0-59),在跨节的时辰上会需要,有的排盘忽略了跨节 1213 | * @param int $ss 秒数(0-59) 1214 | * @return array 1215 | */ 1216 | public function GetInfo($gd, $yy, $mm, $dd, $hh, $mt=0, $ss=0){ 1217 | if(!in_array($gd, [0,1])){ 1218 | return []; 1219 | } 1220 | 1221 | $ret = array(); 1222 | $ret['sex'] = $gd; 1223 | $big_tg = $big_dz = array(); //大运 1224 | 1225 | list($tg, $dz, $jd, $jq, $ix) = $this->GetGanZhi($yy, $mm, $dd, $hh, $mt, $ss); 1226 | $xiong_wang = $this->GetXiongWang($tg[2],$dz[2]); 1227 | $pn = $tg[0] % 2; //起大运.阴阳年干:0阳年1阴年 1228 | 1229 | if(($gd == 0 && $pn == 0) || ($gd == 1 && $pn == 1)) { //起大运时间,阳男阴女顺排 1230 | $span = $jq[$ix + 1] - $jd; //往后数一个节,计算时间跨度 1231 | 1232 | for($i = 1; $i <= 12; $i++){ //大运干支 1233 | $big_tg[] = ($tg[1] + $i) % 10; 1234 | $big_dz[] = ($dz[1] + $i) % 12; 1235 | } 1236 | } else { // 阴男阳女逆排,往前数一个节 1237 | $span = $jd - $jq[$ix]; 1238 | 1239 | for($i = 1; $i <= 12; $i++){ //确保是正数 1240 | $big_tg[] = ($tg[0] + 20 - $i) % 10; 1241 | $big_dz[] = ($dz[0] + 24 - $i) % 12; 1242 | } 1243 | } 1244 | 1245 | $days = intval($span * 4 * 30); //折合成天数:三天折合一年,一天折合四个月,一个时辰折合十天,一个小时折合五天,反推得到一年按360天算,一个月按30天算 1246 | $y = intval($days / 360); //三天折合一年 1247 | $m = intval($days % 360 / 30); //一天折合四个月 1248 | $d = intval($days % 360 % 30); //一个小时折合五天 1249 | 1250 | $ret['tg'] = $tg;//四柱天干 1251 | $ret['dz'] = $dz;//四柱地支 1252 | $ret['bazi'] = []; 1253 | $ret['sc']= $this->GetCTPart($hh,$mt); 1254 | $ret['dz_cg'] = []; 1255 | // $bazi_str=['年,','月,','日,','时']; 1256 | $tg_cg_god = $dz_god = $dz_main_god = $selfQi = $naYin = []; 1257 | for($i = 0; $i <= 3; $i++){ 1258 | $ret['bazi'][]= [$this->ctg[$tg[$i]],$this->cdz[$dz[$i]]]; 1259 | $tg_cg_god[$i] = $this->GetTenGod($tg[2],$tg[$i]); 1260 | $tmp_dzcg = $this->dzcg[$dz[$i]]; 1261 | $tmp_dz_god = []; 1262 | $tmp_dzcg_char = []; 1263 | foreach($tmp_dzcg as $cg){ 1264 | $tmp_dz_god[] = $this->GetTenGod($tg[2],$cg); 1265 | $tmp_dzcg_char[]=$this->ctg[$cg]; 1266 | } 1267 | $ret['dz_cg'][$i] = ['index'=>$tmp_dzcg,'char'=>$tmp_dzcg_char]; 1268 | $dz_main_god[] = $this->GetTenGod($tg[2],$this->dztg[$dz[$i]]); 1269 | $dz_god[$i] = $tmp_dz_god; 1270 | $selfQi[$i] = $this->getSelfQi($tg[2],$dz[$i]); 1271 | $naYin[$i] = $this->naYin($tg[$i],$dz[$i]); 1272 | 1273 | } 1274 | $cs = $year_cs = $month_cs = $hour_cs = []; 1275 | for($i = 0; $i <= 3; $i++){ 1276 | $cs[$i] = $this->GetCs($tg[2],$dz[$i]);//日长生 主要 1277 | $year_cs[$i] = $this->GetCs($tg[0],$dz[$i]); 1278 | $month_cs[$i] = $this->GetCs($tg[1],$dz[$i]); 1279 | $hour_cs[$i] = $this->GetCs($tg[3],$dz[$i]); 1280 | } 1281 | $tg_cg_god[2]=['index'=>[5,5],'char'=>'元']; 1282 | $ret['na_yin'] = $naYin; 1283 | $ret['xw'] = $xiong_wang;//凶亡 1284 | $ret['gong'] = $this->GetGong($tg[0],$dz[1],$dz[3]);//命宫 1285 | $ret['tg_cg_god'] = $tg_cg_god; 1286 | $ret['dz_main_god'] = $dz_main_god; 1287 | $ret['dz_cg_god'] = $dz_god; 1288 | $ret['day_cs'] = $cs; 1289 | $ret['year_cs'] = $year_cs; 1290 | $ret['month_cs'] = $month_cs; 1291 | $ret['hour_cs'] = $hour_cs; 1292 | 1293 | $ret['self_qi'] = $selfQi; 1294 | $ret['big_tg'] = $big_tg; 1295 | $ret['big_dz'] = $big_dz; 1296 | $ret['start_desc'] = "{$y}年{$m}月{$d}天起运"; 1297 | $start_jdtime = $jd + $span * 120; //三天折合一年,一天折合四个月,一个时辰折合十天,一个小时折合五天,反推得到一年按360天算 1298 | $ret['start_time'] = $this->Julian2Solar($start_jdtime); //转换成公历形式,注意这里变成了数组 1299 | 1300 | $ret['big'] = $ret['years'] = []; //八字,大运,流年的字符表示 1301 | $ret['big_start_time'] = $ret['big_god'] = $ret['big_cs'] =[]; //各步大运的起始时间 1302 | 1303 | $ret['xz'] = $this->cxz[$this->GetZodiac($mm, $dd)]; //星座 1304 | $ret['sx'] = $this->csa[$dz[0]]; //生肖 1305 | 1306 | for($i = 0; $i < 12; $i++){ 1307 | $ret['big'][] = $this->ctg[$big_tg[$i]] . $this->cdz[$big_dz[$i]] ; 1308 | $ret['big_cs'][] = $this->getCs($tg[2],$big_dz[$i]); 1309 | $ret['big_god'][] = $this->GetTenGod($tg[2],$big_tg[$i]); 1310 | $ret['big_start_time'][] = $this->Julian2Solar($start_jdtime + $i*10*365); 1311 | } 1312 | $ret['years_info'] = []; 1313 | for($i=1,$j=0; ;$i++){ 1314 | if(($yy + $i) < $ret['start_time'][0]){ //还没到起运年 1315 | continue; 1316 | } 1317 | if($j++ >= 120){ 1318 | break; 1319 | } 1320 | 1321 | $t = ($tg[0] + $i) % 10; 1322 | $d = ($dz[0] + $i) % 12; 1323 | 1324 | //$ret['years'] .= $this->ctg[$t] . $this->cdz[$d] . ' '; 1325 | $tmp_year_dzcg = $this->dzcg[$d]; 1326 | $tmp_year_god = []; 1327 | foreach($tmp_dzcg as $cg){ 1328 | $tmp_year_god[]=$this->GetTenGod($tg[2],$cg); 1329 | } 1330 | 1331 | $ret['years_info'][]=[ 1332 | 'year'=>$yy+$i-1, 1333 | 'index'=>[$t,$d], 1334 | 'char'=>$this->ctg[$t] . $this->cdz[$d], 1335 | 'cg'=>$tmp_year_dzcg, 1336 | 'cs'=>$this->getCs($tg[2],$d), 1337 | 'tg_god'=>$this->GetTenGod($tg[2],$t), 1338 | 'dz_god'=>$tmp_year_god 1339 | 1340 | ]; 1341 | //if($j%10 == 0){ 1342 | // $ret['years'] .= "\n"; 1343 | // } 1344 | } 1345 | 1346 | return (array)$ret; 1347 | } 1348 | /** 1349 | * 纳音运算 1350 | * @param int $tg 天干数字 1351 | * @param int $dz 地枝数字 1352 | * @return array ['纳音名',纳音五行属性数字索引]; 1353 | */ 1354 | public function naYin($tg,$dz){ 1355 | if($tg%2 == 1){ 1356 | $tg = $tg-1; 1357 | $dz = $dz-1; 1358 | } 1359 | $map = [ 1360 | 0=>[ 1361 | 0=>['海中金',3],2=>['大溪水',4],4=>['佛灯火',1], 1362 | 6=>['沙中金',3],8=>['井泉水',4],10=>['山头火',1] 1363 | ], 1364 | 2=>[ 1365 | 0=>['涧下水',4],2=>['炉中火',1],4=>['沙中土',2], 1366 | 6=>['天河水',4],8=>['山下火',1],10=>['房上土',2] 1367 | ], 1368 | 4=>[ 1369 | 0=>['霹雳火',1],2=>['城头土',2],4=>['大林木',0], 1370 | 6=>['天上火',1],8=>['大驿土',2],10=>['平地木',0] 1371 | ], 1372 | 6=>[ 1373 | 0=>['壁上土',2],2=>['松柏木',0],4=>['白腊金',3], 1374 | 6=>['路边土',2],8=>['石榴木',0],10=>['钗钏金',3] 1375 | ], 1376 | 8=>[ 1377 | 0=>['桑松木',0],2=>['金箔金',3],4=>['长流水',4], 1378 | 6=>['杨柳木',0],8=>['剑锋金',3],10=>['大海水',4] 1379 | ] 1380 | ]; 1381 | 1382 | return $map[$tg][$dz]; 1383 | 1384 | } 1385 | } --------------------------------------------------------------------------------