【问题标题】:php switch ($array_key) when there is no key for some array elements当某些数组元素没有键时,php switch ($array_key)
【发布时间】:2016-07-24 00:31:14
【问题描述】:

我有一个数组。

$arrayVar = array(8, 10, 'u'=>24, 'm'=>45, 54, 45);

foreach($arrayVar as $curK=>$curV)

  switch($curK)
  {
      case 'u':

            echo $curK;  //statement

            break;

      default:

             //statements
  }

为什么除了标签与$curK的值匹配时,所有未指定数组键的$curK都会执行第一种情况下的语句?

我确实尝试通过检查 $curK 的空值来解决问题

if(!empty($curK)) {

  foreach($arrayVar as $curK=>$curV)

    switch($curK)
    {
        case 'u':

            echo $curK;  //statement

            break;
    }
}

...

   $arrayVar = array('a'=>8400,'u'=>1100,1300,1400,true);

   echo '<pre>'; print_r($arrayVar);

    foreach($arrayVar as $curK=>$curDU)
    {
        echo "\n" . $curK . "\t";

        switch($curK)
        {
            case 'a':

                echo 'When a : ' . $curK . "\n";

                break;

            case 'u':

                echo 'When u : ' . $curK . "\n";

                break;

            default:
        }
    }

这是我得到的结果

数组 ( [a] => 8400 [u] => 1100 [0] => 1300 [1] => 1400 [2] => 1 )

a 当 a : a

你当你:你

0 当 a : 0

1
2

问题出现在 php 分配的密钥 0 上。

【问题讨论】:

    标签: php arrays switch-statement array-key


    【解决方案1】:

    每个数组元素都有一个键。如果您遍历当前数组并回显每个键,您将得到以下信息:

    $arrayVar = array(8, 10, 'u'=>24, 'm'=>45, 54, 45);
    
    foreach($arrayVar as $curK=>$curV)
    {
      echo $curK, ' ';
    }
    
    //outputs: 0 1 u m 2 3 
    

    Demo

    如您所见,没有指定键的数组元素被赋予下一个可用的数字索引值(第一个从零开始)。

    您的第二个示例不起作用,因为:

    1. 您正在检查一个尚不存在的变量的值(PHP 会通知您),因此您永远不会输入该代码。

    2. 0 将在传递给true 时计算为true,因为正如我上面解释的那样,没有键的数组值将被数字键,第一个值的键为零,它将变为false 在你的 if 语句中可能不是你想要的。

    您可能正在寻找的是在对其进行操作之前确保数组项具有非数字键:

    foreach($arrayVar as $curK=>$curV) {
      if(!is_int($curK)) {
        switch($curK)
        {
            case 'u':
            case 'm':
                echo $curK;  //statement
                break;
            default:
                // do somethng
        }
      }
    }
    

    Demo

    【讨论】:

    • 我得到了我尝试采用的解决方案所犯的错误我的疑问是 - 为什么第一个案例标签下的语句(在这种情况下为“u”)对所有 $curK 执行数组键没有指定?
    • 您发布的代码不应该发生这种情况。
    • 我找不到在评论中添加代码的方法。我已经编辑了问题以添加我用来重新测试的代码。
    • Looks like there's a bug in PHP as 0 显然不等于'a'
    • 谢谢。我试图学习并找出我是否不知道某些事情。
    【解决方案2】:

    每个数组元素都有一个键,即使您没有明确声明它。要查看它们,请使用 array_keys 函数。考虑这个数组:

    $arr = ['apple','banana', 'favorite' => 'plum'];
    

    看起来favorite 是唯一的键,但事实并非如此:

    $keys = array_keys($arr);
    print_r($keys);
    

    结果:

    [
        0 => 0,
        1 => 1,
        2 => 'favorite',
    ]
    

    如您所见,键是01favorite。当未指定键时,PHP 会创建一个并保持递增,从当前最大的整数键开始。如果没有整数键,则以0开头。

    理解数组是 PHP 中的基础。请read the manual

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多