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' + 2
是2
。因为'hello1'
中没有任何前导数字,所以它也是零。
'11hello '
= 11
(包含前导数字,因此 PHP 假定它是 11)。
所以'11hello ' . 1 + 2
简化为'11hello 1' + 2
因为11 + 2
是13
。
更新 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字符串数字连接搞砸了的主要内容,如果未能解决你的问题,请参考以下文章