【问题标题】:Strange output when using a switch inside a foreach loop在 foreach 循环中使用开关时的奇怪输出
【发布时间】:2016-11-03 18:13:01
【问题描述】:

在使用 foreach 循环内的开关将多个数组值分配给多个属性时,我遇到了一个奇怪的问题。基本上,我在此循环上方的方法将数组作为参数(工作正常),我用$array[$key] 分配开关参数,然后使用数组索引作为案例,例如$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,$value & echo 在每个案例之后):

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 输出了 3x 但应该只显示一次,因为大小写与 Key 不匹配

类代码:

 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!

【问题讨论】:

    标签: php arrays switch-statement


    【解决方案1】:

    原因如下:我认为您想逐个输出每个数组元素,但您的案例表达式使用数组元素的值(!)。 $array[4]、$array[5] 和 $array[6] 的值都是 1。由于您的 [4] 案例是第一个,因此它是唯一被触发的案例。

    如果我的假设是正确的,并且您想遍历所有元素,请尝试以下操作:

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

    【讨论】:

      【解决方案2】:

      switch/case 将 $array[$key] 与您编写的条件相匹配。 这意味着对于 key=5,你有 $array[5] = 1 这恰好也是 $array[4] 的值,因此开关将触发 [4] 情况并回显“CAT”

      6 也是如此。

      【讨论】:

        【解决方案3】:

        数组 4,5,6 的值是相同的,即 1.So case 1 被执行。

        【讨论】:

          猜你喜欢
          • 2016-03-07
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-13
          • 2012-07-11
          • 2020-07-12
          • 2014-01-15
          相关资源
          最近更新 更多