Php 将整数视为';truthy';价值
我有一个以字符串和数字作为索引的数组,我使用“foreach”循环和switch语句对其进行迭代:-Php 将整数视为';truthy';价值,php,switch-statement,Php,Switch Statement,我有一个以字符串和数字作为索引的数组,我使用“foreach”循环和switch语句对其进行迭代:- $test = array(1, 2, 3, 'test' => 'value'); foreach ($test as $k => $v) { switch ($k) { case 'test': echo $v . "\n"; break; } } 输出为 1 value 开关似乎将字
$test = array(1, 2, 3, 'test' => 'value');
foreach ($test as $k => $v)
{
switch ($k)
{
case 'test':
echo $v . "\n";
break;
}
}
输出为
1
value
开关似乎将字符串“test”和整数1处理为相同,这似乎不正确。解决方案是将索引转换为字符串
switch ($k . '')
{
...
}
解决方案是将索引转换为字符串
switch ($k . '')
{
...
}
您需要使用
break
来避免这种行为
像这样
switch ((string)$k)
{
case 'test':
echo $v . "\n";
break;
default: echo "-\n";
}
您需要使用
break
来避免这种行为
像这样
switch ((string)$k)
{
case 'test':
echo $v . "\n";
break;
default: echo "-\n";
}
我不能100%确定为什么会发生这种情况,但我怀疑,由于
开关使用松散比较(==而不是===),它将0视为“真实的”,因此执行您的案例
一种解决方法是测试传递的值是否为字符串:-
$test = array(1, 2, 3, 'test' => 'value');
foreach ($test as $k => $v)
{
switch (is_string($k))
{
case 'test':
echo $v . "\n";
break;
}
}
但是,我不确定它是否比您的解决方案更好,尽管对我来说,它更有意义。我不确定为什么会发生这种情况,但我怀疑,由于开关使用松散比较(==而不是===),它会将0视为“真实的”,从而执行您的案例
一种解决方法是测试传递的值是否为字符串:-
$test = array(1, 2, 3, 'test' => 'value');
foreach ($test as $k => $v)
{
switch (is_string($k))
{
case 'test':
echo $v . "\n";
break;
}
}
但是,我不确定它是否比您的解决方案更好,尽管对我来说,它更有意义。这是因为任何字符串在与整数进行粗略比较时,都会转换为整数。如果字符串不是以数字字符开头,则此转换的结果通常为零
$test = 'test';
var_dump((int) $test); // int(0)
开关中的
比较是松散的比较,不严格(=
与==
)
鉴于上述情况,以下是循环中发生的情况,因为您正在打开键(0索引),而不是值:
0 == 'test' // true
1 == 'test' // false
2 == 'test' // false
'test' == 'test' // true
有关详细信息,请参阅。这是因为任何字符串在与整数进行松散比较时都转换为整数。如果字符串不是以数字字符开头,则此转换的结果通常为零
$test = 'test';
var_dump((int) $test); // int(0)
开关中的
比较是松散的比较,不严格(=
与==
)
鉴于上述情况,以下是循环中发生的情况,因为您正在打开键(0索引),而不是值:
0 == 'test' // true
1 == 'test' // false
2 == 'test' // false
'test' == 'test' // true
有关更多信息,请参阅。您的答案很简单
由于开关执行与普通PHP类型判断的比较,您的第一个数组元素将通过检查,因为它具有0
键,这等于test
,因为'test'
的(int)cast是0
您可以将任何值赋给0索引元素,并在检查中看到它。但如果你愿意
$test = array(1=>1,2=>2, 3=>3, 'test' => 'value');
-你只会看到“value”
通过了你的检查你的答案很简单
由于开关执行与普通PHP类型判断的比较,您的第一个数组元素将通过检查,因为它具有0
键,这等于test
,因为'test'
的(int)cast是0
您可以将任何值赋给0索引元素,并在检查中看到它。但如果你愿意
$test = array(1=>1,2=>2, 3=>3, 'test' => 'value');
-您将只看到“value”
通过了您的检查在每个case语句中加一个分隔符。@vascowhite我找到了它。但0问题隐藏在一条3年前的评论中,并以同样的方式解决:转换为字符串。我收回了我的接近票,我为没有正确阅读问题而道歉。这是一个有趣的问题,如果我找到一个好的解决方案,我会发布一个答案。在每个案例陈述中加一个中断。@vascowhite我找到了它。但0问题隐藏在一条3年前的评论中,并以同样的方式解决:转换为字符串。我收回了我的接近票,我为没有正确阅读问题而道歉。这是一个有趣的问题,如果我找到一个好的解决方案,我会发布一个答案。这不是问题,我编辑了这个问题以使其更清楚。它与中断无关;这不是问题,我对问题进行了编辑以使其更清楚。这与中断无关;