PHP 变量的行为类似于 true,即使它的值为 false,具体取决于数字数组的键编号

PHP variable behave like true even if it's value is false, depending on the key numbering of numeric array

我有这个 PHP 代码:

$array = array( 0 => 'brick', 1 => 'brick', 2 => 'window' );
$array_2 = array( 0 => 'brick', 1 => 'brick', 2 => 'door' );

foreach ( $array as $key => $value) 
{
    $my_variable = array();

    foreach ( $array_2 as $key_2 => $value_2 ) 
    {
        $my_variable[ $value_2 ] = !isset( $my_variable[ $value_2 ] ) ?
                                    $key_2 :
                                    'several';

        echo var_dump( $my_variable[ $value_2 ] ) . '<br/>';
        echo var_dump( $my_variable[ $value_2 ] == 'several' ) . '<br/><br/>';                                                                                                      
    }
}

它输出:

int(0) 
bool(true) 

string(7) "several" 
bool(true) 

int(2) 
bool(false) 

int(0) 
bool(true) 

string(7) "several" 
bool(true) 

int(2) 
bool(false) 

int(0) 
bool(true) 

string(7) "several" 
bool(true) 

int(2) 
bool(false)

它的奇怪部分是这个(第一个输出不应该是真的,因为它不等于 'several',因为它说它的值确实等于 0):

int(0) 
bool(true) 

string(7) "several" 
bool(true) 

因为这个条件:

$my_variable[ $value_2 ] == 'several'

所以,问题是:有人知道为什么会这样吗?我忽略的代码有什么问题吗...?

另一方面:如果我更改数组顺序(使其从 1 开始,而不是从 0 开始),它就会神奇地开始工作(输出正确的逻辑):

$array = array( 1 => 'brick', 2 => 'brick', 3 => 'window' );
$array_2 = array( 1 => 'brick', 2 => 'brick', 4 => 'door' );

也可以将条件(无需更改数组编号)切换为:

!is_string( $my_variable[ $value_2 ] )

它可能输出正确的逻辑,但谜团(为什么 PHP 输出 true 如果它应该输出 false)仍然存在。而且我担心将来代码投入生产时会带来一些麻烦。我也很不高兴不知道我是否可能在这里做错了什么......?

根据评论,我想发表一些声明,只是为了弄清楚为什么我在上面的代码中按照我的方式做一些事情:

这里的问题是您正在使用 ==

这将比较值,并且还将转换 值以使它们是同一类型。

0 == 'several'

这两种类型不一样。因此,PHP 会将 'several' 转换为数字 - 0。然后您将得到 0 == 0,这是正确的。

当您更改索引时 "worked" 的原因是您正在做

`1 == 'several'`

其中 PHP 解释为 1 == 0 这是错误的。


您要使用的是===。这将比较 类型和值。

0 === 'several'

这将是错误的,因为一个是数字,另一个是字符串。