【问题标题】:Parse error: Invalid numeric literal in if block解析错误:if 块中的数字文字无效
【发布时间】:2018-03-19 10:26:22
【问题描述】:

我遇到了一些代码问题:

else if ($IDKood[3] . $IDKood[4] == 08) {
            $Month = "August";
        }
        else if ($IDKood[3] . $IDKood[4] == 09) {
            $Month = "September";
        }

基本上如果这两个数字等于给定数字,我希望它输出一个月,这会导致所有月份。 在 08 和 09 号之前一切正常,但我似乎无法修复它。 据我了解,这与 php 本身有关,因此我尝试将数字放入字符串和整数中,但无济于事。

【问题讨论】:

  • 08 更改为8$IDKood[3] . $IDKood[4] 会产生什么结果?
  • 你能检查一下这个 echo $IDKood[3] 吗? $IDKood[4] 和什么给你
  • 如果您要比较 数字,请不要在数字前面加上 0,否则它会被解释为八进制(并且八进制中不允许使用 8/9)。如果您要比较字符串,请将 08放在引号中,例如 '08'
  • 你也在使用字符串运算和“。”但是你不比较字符串 08 而不是 "08"
  • 看到这个snipplet可能是代码优化的好机会......考虑使用数组。

标签: php


【解决方案1】:

如果 PHP 中的整数文字以前导零开头,则它是 八进制。去掉前导零,你就能超过七!

来自the manual

要使用八进制表示法,请在数字前加上 0(零)。

此外,您似乎正在将字符串与数字进行比较。如果 $IDKood 是一个字符数组,那么也许您应该进行字符串比较:

if ($IDKood[3] . $IDKood[4] == '09') {

..虽然正如 ishegg 所观察到的,只要你去掉前导零,implicit conversion from string to integer 就可以正常工作:

if ($IDKood[3] . $IDKood[4] == 9) {

说了这么多,如果您只是将数字转换为月份名称,可能会有better ways to do it

 $dateObj   = DateTime::createFromFormat('!m', (int) ($IDKood[3] . $IDKood[4]));
 $monthName = $dateObj->format('F');

【讨论】:

  • ..这是 XY 问题的经典案例。
  • It doesn't need to be "09" 因为他使用的是==,而不是===edit 虽然我认为你的意思是为了能够与前导零进行比较。
  • @ishegg 没错,但也没有什么坏处,而且我认为这让代码试图匹配的内容更加清晰。
【解决方案2】:

虽然@MattGibson 已经给出了正确的答案(嗯,它似乎是 iMO),但我只想指出,有一种更好的方法可以实现您想要实现的目标。

第一种方式:
有一个包含所有月份的数组

$months = [...,'08'=>"August", "09"=>"September",...];
// then 
$Month = $months[$IDKood[3] . $IDKood[4]];
// no need for all the elseifs

为了使它更好,从$IDKood[3] . $IDKood[4] 中生成一个 int:

$monthIndex = intval($IDKood[3] . $IDKood[4]);
// now you can use the built in dateTime-class to get the string for this month.

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 1970-01-01
    • 2019-01-04
    • 2021-07-14
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多