PHP字符串数字连接搞砸了

Posted

技术标签:

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

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

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

输出 234,

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

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

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

【问题讨论】:

为什么不接受任何答案?@JetLaggy 似乎是新的......接受一个答案,以便线程将被关闭并且回答者获得一些声誉! ;) :) 【参考方案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';

【讨论】:

以上是关于PHP字符串数字连接搞砸了的主要内容,如果未能解决你的问题,请参考以下文章

一个字符搞砸了 htaccess

ggtext 格式被 ggsave 搞砸了

php时间搞砸了

Tomcat:我搞砸了我的 jndi 连接设置还是啥?

JQuery 定义被 TypeScript 0.9 搞砸了

.htaccess 搞砸了 .php 扩展名?