在foreach循环中使用开关时输出奇怪

时间:2016-11-03 18:13:02

标签: php arrays switch-statement

使用foreach循环内的开关将多个数组值分配给多个属性时,我遇到了一个奇怪的问题。基本上我在这个循环上面的方法将一个数组作为参数(工作正常),我用$array[$key]分配switch参数然后使用数组索引作为例子。 $array[0]。这完全有效,直到它到达$array[4]。在案例与$array[4]匹配后,它会分配$array[5]& $array[6]$array[4]我不能为我的生活理解原因。

输入数组(7x参数):

$array = ['server1','192.168.0.1','SERVER1.test.com','This is server 01','1','1','1'];

Foreach循环的输出(每个案例后$key$valueecho):

Name = Key: 0 & Value: server1
IP = Key: 1 & Value: 192.168.0.1
Host = Key: 2 & Value: SERVER1.test.com
Summary = Key: 3 & Value: This is server 01
CAT = Key: 4 & Value: 1
CAT = Key: 5 & Value: 1
CAT = Key: 6 & Value: 1

正如您所看到的,CAT输出3倍但应该只显示一次,因为案例与密钥不匹配

来自班级的代码:

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

    switch ($array[$key]) {

        case $array[0]: $this->nodeName = $value; echo "Name = ";  break;
        case $array[1]: $this->nodeIP = $value; echo "IP = "; break;
        case $array[2]: $this->nodeHostname = $value;echo "Host = ";  break;
        case $array[3]: $this->nodeSummary = $value; echo "Summary = ";  break;
        case $array[4]: $this->nodeCategory = $value; echo "CAT = "; break;
        case $array[5]: $this->nodeSite = $value; echo "Site = "; break;
        case $array[6]: $this->nodeCompany = $value; echo "Company = "; break;
        case $array[7]: $this->nodePort = $value; break;
        case $array[8]: $this->nodeTime = $value; break;

    }

   echo "Key: " . $key . " & Value: " . $value . "<br>"; //For Diag


}

编辑(由于已接受的答案)

  

DOH!

3 个答案:

答案 0 :(得分:2)

原因如下:我认为您希望逐个输出每个数组元素,但您的case表达式使用数组元素的值(!)。 $ array [4],$ array [5]和$ array [6]的值都是1.因为[4]的情况是第一个,它是唯一被触发的情况。

如果我的假设是正确的并且你想循环遍历所有元素,那么试试这个:

switch ($key) {
 case 0: ...
 case 1: ...
}

答案 1 :(得分:1)

开关/案例匹配$ array [$ key]条件IN你写的顺序。 这意味着对于key = 5,你有$ array [5] = 1,它恰好也是$ array [4]的值,因此开关将触发[4] case并回显“CAT”

6也是如此。

答案 2 :(得分:0)

数组4,5,6的值相同,即1.执行情况1。