我在这里工作时使用了一些爆炸的弦乐行走:
array_walk($data, function(&$value)
{
// Transform numerics into appropriate type numbers
if (is_numeric($value))
{
$value = substr_count($value, '.') == 1 ? (float) $value : (int) $value;
}
// Transform dashes into nulls
if ($value == '-')
{
$value = null;
}
});
将值转换为适当的类型,以及一些特殊的字符处理。
我在哪里偶然发现了一个有趣的错误?
错误
我很惊讶,每个条目的初始值string(1) '0'
最终都是null
.
起初,我认为问题依赖于类型转换(float)
,(int)
但在调试后:
var_dump((float) '0', (int) '0');
我看到情况并非如此,得到了预期的结果:
float(0)
int(0)
我花了一段时间来尝试调试,目前似乎是一个明显的弱类型检查,但是,一旦我这样做了,我就震惊了:
var_dump('-' == 0);
上面的表达式似乎是:
bool(true)
现在,在写作的时候,我想我应该调试更多,所以:
var_dump( '=' == 0 );
var_dump( 'What a lovely nonsense?' == 0 );
var_dump( 0 == 'DAFUQ?' ); // maybe it's because of order? It's PHP, world of miracles, you know...
而且,上面列出的每个表达式都是bool(true)
.
好吧,也许那是因为在内部,神秘地 PHP 将表达式转换为(bool)
?
var_dump( (bool) '-' == 0 );
不:
bool(false)
那么,那么,那么……
我在这里做了一个测试用例:http: //codepad.org/smiEvsDj
这个问题存在于 5.2.5(键盘)、5.4.3(朋友)和 5.4.17(我的实际环境)中。
此功能/错误/ what-the-F-actually-is-this背后的原因是什么?