in_array奇怪的逻辑:in_array(“0E3”,[“0E97”,“0E27”])=== true

时间:2017-12-23 23:17:32

标签: 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]=>
  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)

为什么'真'? :)

1 个答案:

答案 0 :(得分:2)

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

您可以通过致电:

轻松强制进行更严格的检查
 var_dump(in_array($c, $hashes, true));

当字符串相同时,这只会返回true。