Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将整数视为';truthy';价值_Php_Switch Statement - Fatal编程技术网

Php 将整数视为';truthy';价值

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 开关似乎将字

我有一个以字符串和数字作为索引的数组,我使用“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”和整数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年前的评论中,并以同样的方式解决:转换为字符串。我收回了我的接近票,我为没有正确阅读问题而道歉。这是一个有趣的问题,如果我找到一个好的解决方案,我会发布一个答案。这不是问题,我编辑了这个问题以使其更清楚。它与中断无关;这不是问题,我对问题进行了编辑以使其更清楚。这与中断无关;