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
)仍然存在。而且我担心将来代码投入生产时会带来一些麻烦。我也很不高兴不知道我是否可能在这里做错了什么......?
根据评论,我想发表一些声明,只是为了弄清楚为什么我在上面的代码中按照我的方式做一些事情:
我在其他循环中循环,以便从 array_2
中获取值,(只是在我的真实代码中,而不是这里,这里的代码只是减去它,到让问题更简单,抱歉造成混淆)。
我回应 var_dump()
以便能够添加 <br/>
字符串(感谢 <br/>
,我完全忽略了它。)- 更正
是的,$my_variable = null;
应该是 $my_variable = array();
,但也只是在这里(在实际代码中,我稍后分配 array()
,并且仅在需要时分配)。 - 更正
这里的问题是您正在使用 ==
。
这将比较值,并且还将转换 值以使它们是同一类型。
0 == 'several'
这两种类型不一样。因此,PHP 会将 'several' 转换为数字 - 0。然后您将得到 0 == 0
,这是正确的。
当您更改索引时 "worked" 的原因是您正在做
`1 == 'several'`
其中 PHP 解释为 1 == 0
这是错误的。
您要使用的是===
。这将比较 类型和值。
0 === 'several'
这将是错误的,因为一个是数字,另一个是字符串。
我有这个 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
)仍然存在。而且我担心将来代码投入生产时会带来一些麻烦。我也很不高兴不知道我是否可能在这里做错了什么......?
根据评论,我想发表一些声明,只是为了弄清楚为什么我在上面的代码中按照我的方式做一些事情:
我在其他循环中循环,以便从
array_2
中获取值,(只是在我的真实代码中,而不是这里,这里的代码只是减去它,到让问题更简单,抱歉造成混淆)。我回应
var_dump()
以便能够添加<br/>
字符串(感谢<br/>
,我完全忽略了它。)- 更正是的,
$my_variable = null;
应该是$my_variable = array();
,但也只是在这里(在实际代码中,我稍后分配array()
,并且仅在需要时分配)。 - 更正
这里的问题是您正在使用 ==
。
这将比较值,并且还将转换 值以使它们是同一类型。
0 == 'several'
这两种类型不一样。因此,PHP 会将 'several' 转换为数字 - 0。然后您将得到 0 == 0
,这是正确的。
当您更改索引时 "worked" 的原因是您正在做
`1 == 'several'`
其中 PHP 解释为 1 == 0
这是错误的。
您要使用的是===
。这将比较 类型和值。
0 === 'several'
这将是错误的,因为一个是数字,另一个是字符串。