【问题标题】:foreach switch loopforeach 切换循环
【发布时间】:2012-08-17 23:05:02
【问题描述】:

我很困惑为什么会发生这个错误,如果有人可以帮忙

foreach ( $filters as $_filter )
{  
    switch ($_filter[1])
    {   
        case "/FlateDecode" :
            if (function_exists("gzuncompress") )
            {   echo 'testing1';
                $xrefStreamData = 0 < strlen( $xrefStreamData ) ? gzuncompress( @$xrefStreamData ) : "";
            }
            else
            {
                $this->error( sprintf( "To handle %s filter, please compile php with zlib support.", $_filter[1] ) );
            }
            if ( $xrefStreamData === false )
            {  echo 'testing2';
                $this->error( "Error while decompressing stream." );
            }
            break;

        case "/LZWDecode" :
                echo 'testing3';
            include_once( "filters/FilterLZW_FPDI.php" );
                 //does not go through
            $decoder = new FilterLZW_FPDI( $this->fpdi );
            $xrefStreamData = $decoder->decode( $xrefStreamData );
            break;
        case "/ASCII85Decode" :
            echo 'testing4';
            include_once( "filters/FilterASCII85_FPDI.php" );
            $decoder = new FilterASCII85_FPDI( $this->fpdi );
            $xrefStreamData = $decoder->decode( $xrefStreamData );
            break;
        case null :
            break;
    }
    $this->error( "Unsupported Filter: %s", $_filter[1] );
}

我将回显设置为调试以查看它通过哪些循环,我得到的输出是 testing1 不支持的过滤器 %s

这是否意味着数组$_filter 为空?如果它是 null 为什么它首先进入 foreach 循环?

【问题讨论】:

  • "如果它为空,为什么它首先进入 foreach 循环?"如果 $filters 不为空,foreach 循环将运行,它不关心 $_filters。例如,$filters=array(array("foo")) 将创建一个数组,其中$_filters[1] 为空。你确定 $filters 真的是数组数组,而不是字符串数组吗?

标签: php foreach


【解决方案1】:

您的代码很好。行:

$this->error( "Unsupported Filter: %s", $_filter[1] );

是在 case 语句中的所有条件检查之后,因此将始终打印出来!

你应该做的是,像这样把它放在一个默认子句下:

...
case null :
     break;

default:
     $this->error( "Unsupported Filter: %s", $_filter[1] );
     break;

顺便说一句,我不知道 null: 是什么情况,但实际上我会用默认值替换它。

【讨论】:

  • 而且看起来 error() 方法没有进行 printf 样式的替换,所以它没有打印出 $_filter[1] 中的内容。将echo 'Filter: ', $_filter[1], "\n"; 放在switch 语句之前。
  • 不,echo 是特殊的,它允许给出多个参数并将它们全部打印出来。
  • @Supra Man:内部是$this-&gt;error() 调用sprintf()?你能粘贴$this-&gt;error() 的样子吗?
猜你喜欢
  • 2014-10-04
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 2019-04-04
  • 2018-08-20
  • 2018-02-16
  • 1970-01-01
相关资源
最近更新 更多