Php 在U数组中奇怪的逻辑:在U数组中(“0E3”、“0E97”、“0E27”)==true

Php 在U数组中奇怪的逻辑:在U数组中(“0E3”、“0E97”、“0E27”)==true,php,Php,我检查了hachids包是否存在冲突,但我的检查脚本(在macOS 10.12.6上)中有一个奇怪的结果 我从检查脚本中重写了一些代码,并提出了一个问题: # php -v PHP 7.1.11 (cli) (built: Oct 27 2017 11:00:43) ( NTS ) # php -a php > $hashes = array('0E97', '0E27'); php > var_dump($hashes); array(2) { [0]=> st

我检查了
hachids
包是否存在冲突,但我的检查脚本(在macOS 10.12.6上)中有一个奇怪的结果

我从检查脚本中重写了一些代码,并提出了一个问题:

# php -v
PHP 7.1.11 (cli) (built: Oct 27 2017 11:00:43) ( NTS )


# php -a

php > $hashes = array('0E97', '0E27');
php > var_dump($hashes);
array(2) {
  [0]=>
  string(4) "0E97"
  [1]=>
  string(4) "0E27"
}
php > $c = '0E3';
php > var_dump($c);
string(3) "0E3"
php > var_dump(in_array($c, $hashes));
bool(true)

为什么是“真的”?:)

在PHP眼中,这三个字符串都是数字;在本例中,e(或e)表示指数,PHP将基数与指数(或幂)分开。例如,
0E3
表示
0*1000
,其他两个字符串的等效值(更多的零)。因此,PHP将字符串视为数字,并且,由于0乘以任何值都是0,因此将它们视为相等。 如果字符串中的字母不是
E
,而是例如
F
,则字符串将不同。只有e和e有这个特殊的意义

您可以通过拨打以下电话轻松强制执行更严格的检查:

 var_dump(in_array($c, $hashes, true));

当字符串相同时,这将仅返回true。

值得添加
e
(或
e
)在本例中表示
exponent
,它将基数与指数(或幂)分开。谢谢@marekful,我在答案中加入了您的评论。它比放零更好更精确。。。