根据生日计算星座 PHP

        /**
* 根据生日计算星座
*/
private function get_constellation($birthday)

{

                //    传入$birthday格式如:2018-05-06

$month = intval(substr($birthday, 5, 2));   
$day = intval(substr($birthday, 8, 2));
if ($month < 1 || $month > 12 || $day < 1 || $day > 31)
{
return NULL;
}
$signs = array(
array('20' => '水瓶座'),
array('19' => '双鱼座'),
array('21' => '白羊座'),
array('20' => '金牛座'),
array('21' => '双子座'),
array('22' => '巨蟹座'),
array('23' => '狮子座'),
array('23' => '处女座'),
array('23' => '天秤座'),
array('24' => '天蝎座'),
array('22' => '射手座'),
array('22' => '摩羯座')
);
list($start, $name) = each($signs[$month - 1]);
if ($day < $start)
{
list($start, $name) = each($signs[($month - 2 < 0) ? 11 : $month - 2]);
}

return $name;

}



<think>我们根据用户意图“根据生日查询星座”进行网络搜索。搜索关键词可以是“星座日期范围”、“星座查询方法”等。 根据搜索结果,星座的划分主要依据阳历(公历)生日,每个星座对应一个日期范围。以下是常见的星座日期划分: 白羊座(3月21日~4月19日) 金牛座(4月20日~5月20日) 双子座(5月21日~6月21日) 巨蟹座(6月22日~7月22日) 狮子座(7月23日~8月22日) 处女座(8月23日~9月22日) 天秤座(9月23日~10月23日) 天蝎座(10月24日~11月22日) 射手座(11月23日~12月21日) 摩羯座(12月22日~1月19日) 水瓶座(1月20日~2月18日) 双鱼座(2月19日~3月20日) 注意:不同来源可能对边界日期的星座归属有微小差异,但以上是普遍接受的划分。 根据用户需求,我们需要提供一种根据生日期(公历)查询对应星座的方法。我们可以通过编程实现,也可以直接通过查表方式实现。 方法一:查表法 将每个星座的起始日期和结束日期列出来,然后判断给定日期落在哪个区间内。注意摩羯座跨年,需要特殊处理。 方法二:使用星座边界日期列表 我们可以将星座的起始日期按顺序排列,然后判断日期在哪个起始日期之后,直到下一个星座的起始日期之前。 具体步骤: 1. 将星座按日期顺序排列(从摩羯座开始?因为摩羯座跨年,但通常我们按1月到12月顺序,所以从水瓶座开始?实际上我们需要考虑跨年问题,所以将摩羯座分成两部分处理?) 2. 更简单的方法是:将星座的起始日期按月份和日组成一个数字(例如1月20日转换为0120),然后同样把出生日期转换为月日数字(如0225表示2月25日),然后比较这个数字。 但是注意摩羯座跨年,例如1月19日之前是摩羯座,1月20日到2月18日是水瓶座,因此对于1月和2月部分日期属于摩羯座,而大部分摩羯座在12月。 因此,我们可以这样处理: - 如果月份是1月且日期小于20,则属于摩羯座(12月22日~1月19日) - 如果月份是12月且日期大于等于22,则属于摩羯座 - 其他星座不跨年,按正常月份判断。 另一种方法是:将星座的起始日期按一年中的顺序排列(包括跨年),然后使用二分查找或顺序查找。 我们采用一种更简单的方法:将星座按起始日期排序(从一年的开始排),但注意摩羯座有两个区间?其实我们可以将星座的起始日期按顺序排列,然后判断。但摩羯座跨年,我们可以将摩羯座的后半部分(12月22日~12月31日)视为一年中的最后,而前半部分(1月1日~1月19日)视为下一年的开始?这样处理复杂。 实际上,我们可以将星座的起始日期按以下方式排列(以一年中的第几天计算): 摩羯座1:1月1日到1月19日(对应第1天到第19天) 水瓶座:1月20日到2月18日(第20天到第49天左右) ... 摩羯座2:12月22日到12月31日(第356天到第365天) 这样我们需要将日期转换为一年中的第几天(ordinal date),然后判断: 如果第n天在356-365(或366)之间,则是摩羯座(12月22日之后的部分) 如果第n天在1-19之间,则是摩羯座(1月1日到1月19日) 否则,判断在其他星座的区间。 但是这样需要两个区间,比较麻烦。 更常见的做法是:将星座的起始日期按月份和日组成一个数字,然后按以下顺序排列星座边界点(注意:摩羯座跨年,我们将其分为两个区间,但通常将摩羯座的开始日期作为第一个星座的起点,即12月22日,然后顺序排下去,直到射手座结束。这样一年中星座的顺序是:摩羯座(12月22日)->水瓶座->双鱼座->...->射手座(11月23日~12月21日))。这样,我们可以将星座边界点按时间顺序排列(从12月22日开始),但这样在编程时,如果日期在12月22日之后(即12月22日~12月31日)和1月1日到1月19日都是摩羯座?不对,实际上1月20日之前都是摩羯座(直到1月19日),1月20日才是水瓶座。 因此,我们采用以下方法: 将星座边界点按月份和日组成一个数字(月*100+日),然后按时间顺序排列(从1月1日开始),但摩羯座跨年,我们将摩羯座的后半部分(12月22日~12月31日)视为一个区间(数值1222~1231),而1月1日到1月19日视为另一个区间(数值101~119)。这样我们需要将两个区间合并为摩羯座?但这样判断复杂。 实际上,我们可以将星座的起始日期(即每个星座的开始日期)按时间顺序排列(从白羊座开始?),但这样并不连续。更简单的方法是:将日期转换为一个整数(月份*100+日期),然后按以下顺序判断: 水瓶座:1月20日 - 2月18日 (120-218) 双鱼座:2月19日 - 3月20日 (219-320) 白羊座:3月21日 - 4月19日 (321-419) 金牛座:4月20日 - 5月20日 (420-520) 双子座:5月21日 - 6月21日 (521-621) 巨蟹座:6月22日 - 7月22日 (622-722) 狮子座:7月23日 - 8月22日 (723-822) 处女座:8月23日 - 9月22日 (823-922) 天秤座:9月23日 - 10月23日 (923-1023) 天蝎座:10月24日 - 11月22日 (1024-1122) 射手座:11月23日 - 12月21日 (1123-1221) 摩羯座:12月22日 - 1月19日 注意:这里跨年,所以分成两段:1222-1231 和 101-119 因此,判断逻辑: 如果月份为12且日期>=22,或者月份为1且日期<=19,则为摩羯座。 否则,计算一个整数 md = 月份*100+日期,然后判断: 如果 md >=120 且 md<=218 -> 水瓶座 如果 md >=219 且 md<=320 -> 双鱼座 ... 以此类推,直到射手座(1123-1221)实际上射手座只到12月21日,而12月22日以上已经被摩羯座捕获,所以不会进入这个分支。 因此,我们可以这样实现: 步骤: 1. 输入日期(假设为公历),提取月份和日期。 2. 如果月份等于1且日期小于等于19,则星座为摩羯座。 3. 如果月份等于12且日期大于等于22,则星座为摩羯座。 4. 否则,计算 md = 月份*100+日期,然后使用以下区间判断: md>=120 and md<=218: 水瓶座 md>=219 and md<=320: 双鱼座 md>=321 and md<=419: 白羊座 md>=420 and md<=520: 金牛座 md>=521 and md<=621: 双子座 md>=622 and md<=722: 巨蟹座 md>=723 and md<=822: 狮子座 md>=823 and md<=922: 处女座 md>=923 and md<=1023: 天秤座 md>=1024 and md<=1122: 天蝎座 md>=1123 and md<=1221: 射手座 注意:由于我们已经处理了1月和12月的摩羯座,所以剩下的月份中,12月1日到12月21日会进入md计算,并且会落在射手座(1123-1221)区间,因为12月1日对应1201,在1123和1221之间(1201>=1123且<=1221)?不对,因为1123表示11月23日,而12月1日是1201,大于1123,但小于1221(12月21日)?不对,1221是12月21日,所以1201(12月1日)在1123(11月23日)之后,所以是射手座?不对,射手座是11月23日到12月21日,所以1201在范围内,正确。 但是,注意:我们上面的区间判断是顺序判断,如果使用if-else,那么只要满足一个条件就会跳出。所以我们可以按顺序判断。 然而,还有一种更简洁的方法:将星座的起始日期(每个星座的开始日期)按时间顺序(从1月1日开始)排列,然后每个星座对应一个起始日期的整数(月*100+日),然后判断日期整数落在哪个星座的区间。 星座起始日期(每个星座的开始日期): 摩羯座:12月22日(1222) # 但是跨年,所以特殊 水瓶座:1月20日(120) 双鱼座:2月19日(219) 白羊座:3月21日(321) 金牛座:4月20日(420) 双子座:5月21日(521) 巨蟹座:6月22日(622) 狮子座:7月23日(723) 处女座:8月23日(823) 天秤座:9月23日(923) 天蝎座:10月24日(1024) 射手座:11月23日(1123) 然后,我们创建一个列表,按起始日期排序(从小到大): [120, 219, 321, 420, 521, 622, 723, 823, 923, 1024, 1123, 1222] 对应的星座: 120: '水瓶座' 219: '双鱼座' 321: '白羊座' 420: '金牛座' 521: '双子座' 622: '巨蟹座' 723: '狮子座' 823: '处女座' 923: '天秤座' 1024: '天蝎座' 1123: '射手座' 1222: '摩羯座' 但是注意,摩羯座跨年,所以我们需要将日期在1222-1231以及101-119(即1月1日到1月19日)都归为摩羯座。而我们的列表是从120(1月20日)开始的,所以1月1日到1月19日不在上述列表中。因此,我们可以这样处理: 将1月1日到1月19日单独处理为摩羯座,然后从1月20日(120)开始,我们使用二分查找,找到最后一个小于等于当前md的起始日期,然后对应的星座就是所求。 具体步骤: 1. 输入月份和日期,计算md=月份*100+日期。 2. 如果月份为1且日期<=19,则返回摩羯座。 3. 否则,我们有一个起始日期列表:[120,219,...,1222](12个元素),然后我们在这个列表中找到最后一个小于等于md的元素,该元素对应的星座就是结果。 4. 但是注意,12月22日(1222)之后(到12月31日)也是摩羯座,所以当md>=1222时,我们直接返回摩羯座?不对,因为12月22日之前(12月1日到12月21日)属于射手座(起始日期1123),而12月22日之后属于摩羯座。所以我们在列表中包含了1222(摩羯座),所以当md>=1222时,我们找到的最后一个小于等于md的起始日期就是1222(摩羯座)。但是,12月22日到12月31日都在1222之后,所以也会被匹配到摩羯座(因为1222<=md,且1222是列表中最后一个小于等于md的元素?不一定,因为1222后面没有其他元素了,所以匹配到1222对应的摩羯座)。 但是,1月20日(120)到2月18日(218)之间,我们找到的最后一个小于等于md的起始日期是120(水瓶座),正确。 2月19日(219)到3月20日(320)之间,最后一个小于等于md的起始日期是219(双鱼座),正确。 因此,算法如下(伪代码): 定义星座起始日期列表:starts = [120,219,321,420,521,622,723,823,923,1024,1123,1222] 定义星座名称列表:constellations = ['水瓶座','双鱼座','白羊座','金牛座','双子座','巨蟹座','狮子座','处女座','天秤座','天蝎座','射手座','摩羯座'] 输入:月份m,日期d 计算 md = m*100+d 如果 m==1 and d<=19: 返回 '摩羯座' 否则: 从后向前遍历starts列表(或从大到小),找到第一个小于等于md的起始日期(因为列表是递增的,所以可以二分查找),然后返回对应的星座名称。 注意:由于起始日期列表是递增的,我们可以使用二分查找,但也可以顺序查找(因为只有12个元素)。 但是,注意:我们也可以将1月1日到1月19日视为摩羯座,然后1月20日到12月21日使用上述列表,而12月22日到12月31日也视为摩羯座,所以也可以这样: 如果 m==12 and d>=22: 返回摩羯座 如果 m==1 and d<=19: 返回摩羯座 否则,使用列表查找。 这样,我们就可以避免在列表中处理摩羯座跨年的问题,因为列表中的摩羯座起始日期1222实际上在12月22日,而12月22日之后我们已经在第一个if中处理了(m==12 and d>=22),所以不会进入列表查找。而1月1日到1月19日也在第一个if(m==1)中处理了。所以剩下的日期(1月20日到12月21日)使用列表查找。 因此,步骤: 1. 输入月份m和日期d。 2. 如果 (m==1 and d<=19) or (m==12 and d>=22): 星座 = '摩羯座' 3. 否则: md = m*100 + d 设置起始日期列表:starts = [120,219,321,420,521,622,723,823,923,1024,1123] # 注意,这里我们不需要1222了,因为12月22日以上已经被上面的条件捕获 星座列表:constellations = ['水瓶座','双鱼座','白羊座','金牛座','双子座','巨蟹座','狮子座','处女座','天秤座','天蝎座','射手座'] # 注意:列表有11个元素,因为摩羯座已经被单独处理 遍历starts列表,找到最后一个小于等于md的起始日期,然后返回对应的星座。 但是,注意:起始日期列表中的日期是每个星座的开始日期,而我们的日期md可能落在某个星座的区间内(从该星座的起始日期到下个星座起始日期前一天)。所以,我们实际上需要找到的是小于等于md的最大起始日期,然后该起始日期对应的星座就是结果。 例如:3月21日(321)是白羊座开始,那么3月21日到4月19日都是白羊座。而4月20日(420)是金牛座开始。 所以,对于4月15日(md=415),我们遍历starts列表,小于等于415的最大起始日期是321(白羊座),所以是白羊座?不对,因为4月15日应该在白羊座(3月21日到4月19日)内,而下一个星座金牛座从4月20日开始。所以正确。 因此,我们可以这样实现(使用二分查找或顺序查找): 由于列表元素少,顺序查找即可。 初始化星座索引为0(即第一个星座水瓶座) 遍历starts列表(从第一个到最后一个): 如果当前起始日期<=md,则记录当前星座索引,并继续(因为我们想找到最后一个小于等于md的) 否则,跳出循环。 最后一个满足条件的起始日期对应的星座就是结果。 但是,这样需要遍历整个列表,我们可以倒序遍历,找到第一个小于等于md的起始日期,然后返回对应的星座。 或者,我们可以这样:从后向前遍历,找到第一个小于等于md的起始日期,然后返回该日期对应的星座。 例如:md=415,从后向前:1123>415? 跳过,1024>415?跳过,...直到420>415?跳过,然后321<=415,所以找到321,对应白羊座。 所以,步骤: 倒序遍历starts列表(从最后一个元素开始到第一个): 如果当前起始日期<=md,则返回该起始日期对应的星座。 因为列表是递增的,所以倒序遍历时,第一个满足条件的起始日期就是小于等于md的最大起始日期。 因此,代码实现: 注意:我们也可以使用一个数组,同时存储起始日期和星座名称,然后按起始日期排序(从小到大),然后倒序查找。 由于我们已知starts和constellations,我们可以: 定义: const boundaries = [ { date: 120, name: '水瓶座' }, { date: 219, name: '双鱼座' }, { date: 321, name: '白羊座' }, { date: 420, name: '金牛座' }, { date: 521, name: '双子座' }, { date: 622, name: '巨蟹座' }, { date: 723, name: '狮子座' }, { date: 823, name: '处女座' }, { date: 923, name: '天秤座' }, { date: 1024, name: '天蝎座' }, { date: 1123, name: '射手座' } ] 然后,倒序遍历boundaries,找到第一个boundary.date<=md的,返回boundary.name。 如果没有找到?不可能,因为md至少是120(1月20日)以上,而我们的列表第一个是120。 但是,注意:1月20日到2月18日(120到218)之间,在倒序遍历时,第一个检查的是1123(大于218),然后1024(大于218)...直到219(大于218)?不对,219>218,所以不会匹配,直到120(120<=218)才匹配,所以返回水瓶座,正确。 因此,我们给出两种实现方式: 方式一:条件判断法(简单直接) 根据月份和日期,使用多个if-else判断。 方式二:查表法(更灵活,便于维护) 这里我们提供两种方法的代码示例(使用JavaScript,因为用户可能在前端使用,也可以在Node.js后端使用)。 方法一:条件判断法(适合简单实现) ```javascript function getZodiac(month, day) { // 将月份和日期组合成一个整数,例如 2月14日 -> 214 let md = month * 100 + day; if ((month === 1 && day <= 19) || (month === 12 && day >= 22)) { return "摩羯座"; } else if (md >= 120 && md <= 218) { return "水瓶座"; } else if (md >= 219 && md <= 320) { return "双鱼座"; } else if (md >= 321 && md <= 419) { return "白羊座"; } else if (md >= 420 && md <= 520) { return "金牛座"; } else if (md >= 521 && md <= 621) { return "双子座"; } else if (md >= 622 && md <= 722) { return "巨蟹座"; } else if (md >= 723 && md <= 822) { return "狮子座"; } else if (md >= 823 && md <= 922) { return "处女座"; } else if (md >= 923 && md <= 1023) { return "天秤座"; } else if (md >= 1024 && md <= 1122) { return "天蝎座"; } else if (md >= 1123 && md <= 1221) { return "射手座"; } // 其他情况(理论上不会发生,因为12月22日以上已经被第一个条件捕获,1月20日以下也被第一个条件捕获,而12月22日到12月31日被第一个条件捕获,1月1日到1月19日也被第一个条件捕获) return "未知"; } ``` 方法二:使用查表法(更优雅,便于扩展) ```javascript function getZodiac(month, day) { // 处理摩羯座(跨年部分) if ((month === 1 && day <= 19) || (month === 12 && day >= 22)) { return "摩羯座"; } // 星座分界点(每个星座的起始日期),按日期顺序(从1月20日开始到12月21日) const boundaries = [ { date: 120, name: '水瓶座' }, // 1月20日 { date: 219, name: '双鱼座' }, // 2月19日 { date: 321, name: '白羊座' }, // 3月21日 { date: 420, name: '金牛座' }, // 4月20日 { date: 521, name: '双子座' }, // 5月21日 { date: 622, name: '巨蟹座' }, // 6月22日 { date: 723, name: '狮子座' }, // 7月23日 { date: 823, name: '处女座' }, // 8月23日 { date: 923, name: '天秤座' }, // 9月23日 { date: 1024, name: '天蝎座' }, // 10月24日 { date: 1123, name: '射手座' } // 11月23日 ]; let md = month * 100 + day; // 由于边界点按从小到大的顺序排列,我们倒序遍历,找到第一个小于等于md的边界点 for (let i = boundaries.length - 1; i >= 0; i--) { if (md >= boundaries[i].date) { return boundaries[i].name; } } // 理论上不会执行到此处,因为1月20日(120)是最小的边界点 return "未知"; } ``` 注意:以上代码中的日期范围是普遍接受的,但不同流派可能略有差异,用户可根据需要调整。 因此,用户可以根据生日期的月份和日期,使用上述函数查询对应的星座。 另外,如果用户需要直接查询,也可以参考星座日期对照表。 星座日期对照表(公历): 摩羯座:12月22日~1月19日 水瓶座:1月20日~2月18日 双鱼座:2月19日~3月20日 白羊座:3月21日~4月19日 金牛座:4月20日~5月20日 双子座:5月21日~6月21日 巨蟹座:6月22日~7月22日 狮子座:7月23日~8月22日 处女座:8月23日~9月22日 天秤座:9月23日~10月23日 天蝎座:10月24日~11月22日 射手座:11月23日~12月21日 用户只需将出生日期对照此表即可。 总结:根据生日期查询星座,主要依据公历日期,对照星座日期范围表即可。若需编程实现,可使用上述两种方法之一。 §§相关问题§§: 1. 星座日期范围在不同文化或占星学流派中有差异吗? 2. 如何根据生日期查询星座的性格特点? 3. 星座查询是否考虑出生时间(如时辰)和出生地点?</think>### 根据生日期查询星座的方法 #### 星座日期范围对照表 查询星座需使用公历(阳历)生日,对照以下日期范围: ``` 摩羯座:12月22日~1月19日 水瓶座:1月20日~2月18日 双鱼座:2月19日~3月20日 白羊座:3月21日~4月19日 金牛座:4月20日~5月20日 双子座:5月21日~6月21日 巨蟹座:6月22日~7月22日 狮子座:7月23日~8月22日 处女座:8月23日~9月22日 天秤座:9月23日~10月23日 天蝎座:10月24日~11月22日 射手座:11月23日~12月21日 ``` #### 编程实现方法(JavaScript) ```javascript function getZodiac(month, day) { // 摩羯座跨年特殊处理 if ((month === 1 && day <= 19) || (month === 12 && day >= 22)) { return "摩羯座"; } // 日期转换为数字(如3月21日=321) const dateNum = month * 100 + day; // 星座判断逻辑 if (dateNum >= 120 && dateNum <= 218) return "水瓶座"; if (dateNum >= 219 && dateNum <= 320) return "双鱼座"; if (dateNum >= 321 && dateNum <= 419) return "白羊座"; if (dateNum >= 420 && dateNum <= 520) return "金牛座"; if (dateNum >= 521 && dateNum <= 621) return "双子座"; if (dateNum >= 622 && dateNum <= 722) return "巨蟹座"; if (dateNum >= 723 && dateNum <= 822) return "狮子座"; if (dateNum >= 823 && dateNum <= 922) return "处女座"; if (dateNum >= 923 && dateNum <= 1023) return "天秤座"; if (dateNum >= 1024 && dateNum <= 1122) return "天蝎座"; if (dateNum >= 1123 && dateNum <= 1221) return "射手座"; return "未知星座"; } // 示例:查询5月15日的星座 console.log(getZodiac(5, 15)); // 输出"金牛座" ``` #### 手动查询步骤 1. 确认出生日期为公历(非农历) 2. 在对照表中查找包含生日的日期区间 3. 注意跨年星座(摩羯座)的特殊性 4. 边界日期(如3月20日)需确认具体年份的星座划分 - 部分年份3月20日可能属双鱼座或白羊座 #### 在线查询工具 推荐使用以下平台自动查询: - 腾讯星座频道(星座日期查询) - 新浪星座(出生日期转星座) - 专业占星网站(如Astro.com)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值