├── 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 | 
2 |
3 | ThinkPHP 5.1(LTS版本) —— 12载初心,你值得信赖的PHP框架
4 | ===============
5 |
6 | [](https://scrutinizer-ci.com/g/top-think/framework/?branch=5.1)
7 | [](https://travis-ci.org/top-think/framework)
8 | [](https://packagist.org/packages/topthink/framework)
9 | [](https://packagist.org/packages/topthink/framework)
10 | [](http://www.php.net/)
11 | [](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 | }
--------------------------------------------------------------------------------