【问题标题】:PHP string number concatenation messed upPHP字符串数字连接搞砸了
【发布时间】:2013-04-24 01:46:35
【问题描述】:

我在这里得到了一些 PHP 代码:

<?php
    echo 'hello ' . 1 + 2 . '34';
?>

输出 234,

但是当我在“你好”前加一个数字 11 时:

<?php
    echo '11hello ' . 1 + 2 . '34';
?>

它输出 1334 而不是 245(我期望它)。这是为什么呢?

【问题讨论】:

  • 为什么不接受任何答案?@JetLaggy 似乎是新的......接受一个答案,以便线程将被关闭并且回答者获得一些声誉! ;) :)

标签: php string concatenation operator-keyword operator-precedence


【解决方案1】:

这很奇怪……

但是

<?php
    echo '11hello ' . (1 + 2) . '34';
?>

<?php
    echo '11hello ', 1 + 2, '34';
?>

解决了这个问题。


更新 v1:

我终于得到了正确的答案:

'hello' = 0(不包含前导数字,因此 PHP 假定它为零)。

所以'hello' . 1 + 2 简化为'hello1' + 22。因为'hello1' 中没有任何前导数字,所以它也是零。


'11hello ' = 11(包含前导数字,因此 PHP 假定它是 11)。

所以'11hello ' . 1 + 2 简化为'11hello 1' + 2 因为11 + 213


更新 v2:

来自Strings

该值由字符串的初始部分给出。如果字符串 以有效的数字数据开头,这将是使用的值。 否则,该值将为 0(零)。有效的数字数据是 可选符号,后跟一个或多个数字(可选包含一个 小数点),后跟一个可选的指数。指数是一个 'e' 或 'E' 后跟一个或多个数字。

【讨论】:

  • 嗨,伙计。感谢您的快速回复。 245 是我期望它输出的,但它显示 1334。我只是不明白为什么如果我在 hello 字符串之前添加数字,优先级会改变。
  • PHP 非常喜欢将所有内容都转换为数字。阅读here
  • @CORRUPT 非常感谢!一个完整的答案,易于理解。干杯~
【解决方案2】:

点运算符有the same precedence+-,这可能会产生意想不到的结果。

这从技术上回答了您的问题...如果您希望在连接过程中将数字视为数字,只需将它们括在括号中即可。

<?php
    echo '11hello ' . (1 + 2) . '34';
?>

【讨论】:

  • 干杯,这有帮助。我真的应该坚持使用 php 手册。因为我之前读过的那篇文章说串联的优先级高于加法……真可惜……
  • 在 PHP 8 中,“+”和“-”现在具有更高的优先级。这样问题就解决了。
【解决方案3】:

你必须在数学运算中使用()

echo 'hello ' . (1 + 2) . '34'; // output hello334
echo '11hello ' . (1 + 2) . '34'; // output 11hello334

【讨论】:

  • 仍然,它没有解释为什么 php 在连接时忽略 concat 运算符并将 string 类型转换为 int。充当 sum,但不是 concat。
【解决方案4】:

您应该查看the PHP type conversion table 以更好地了解幕后发生的事情。

【讨论】:

    【解决方案5】:

    如果您不喜欢将运算符放在中间,请将它们分配给变量:

    $var = 1 + 2;
    
    echo 'hello ' . $var . '34';
    

    【讨论】:

      猜你喜欢
      • 2012-12-27
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 2012-06-08
      相关资源
      最近更新 更多