首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计数-致命错误: PHP8 ()必须是Countable|array类型

计数-致命错误: PHP8 ()必须是Countable|array类型
EN

Stack Overflow用户
提问于 2021-06-28 00:53:48
回答 1查看 122关注 0票数 0

我使用的是PHP库:https://github.com/myokyawhtun/PDFMerger

我们经常使用它来下载大量的客户文档。偶尔我会收到这样的错误:

代码语言:javascript
复制
Fatal error: Uncaught TypeError: count(): Argument #1 ($var) must be of type Countable|array, bool given in C:\MyPath\www\PDFMerger\tcpdf\tcpdi_parser.php:503 Stack trace: #0 C:\MyPath\www\PDFMerger\tcpdf\tcpdi_parser.php(373): tcpdi_parser->decodeXrefStream() #1 C:\MyPath\www\\PDFMerger\tcpdf\tcpdi_parser.php(212): tcpdi_parser->getXrefData() #2 C:\MyPath\www\\PDFMerger\tcpdf\tcpdi.php(121): tcpdi_parser->__construct() #3 C:\MyPath\www\\PDFMerger\tcpdf\tcpdi.php(88): TCPDI->_getPdfParser() #4 C:\MyPath\www\\PDFMerger\PDFMerger.php(97): TCPDI->setSourceFile() #5 C:\MyPath\www\\offline downloads\download-DL100.php(75): PDFMerger\PDFMerger->merge() #6 {main} thrown in C:\MyPath\www\\PDFMerger\tcpdf\tcpdi_parser.php on line 503

错误行的代码是:

代码语言:javascript
复制
    $valid_crs = false;
    $sarr = $xrefcrs[0][1];
    $keys = array_keys($sarr);
        $columns = 1; // Default as per PDF 32000-1:2008.
    $predictor = 1; // Default as per PDF 32000-1:2008.
    foreach ($keys as $k=>$key) {
            $v = $sarr[$key];
            if (($key == '/Type') AND ($v[0] == PDF_TYPE_TOKEN AND ($v[1] == 'XRef'))) {
                    $valid_crs = true;
            } elseif (($key == '/Index') AND ($v[0] == PDF_TYPE_ARRAY AND count($v[1] >= 2))) {
                    // first object number in the subsection
                    $index_first = intval($v[1][0][1]);
                    // number of entries in the subsection
                    $index_entries = intval($v[1][1][1]);
            } elseif (($key == '/Prev') AND ($v[0] == PDF_TYPE_NUMERIC)) {
                    // get previous xref offset
                    $prevxref = intval($v[1]);
            } elseif (($key == '/W') AND ($v[0] == PDF_TYPE_ARRAY)) {
                    // number of bytes (in the decoded stream) of the corresponding field
                    $wb = array();
                    $wb[0] = intval($v[1][0][1]);
                    $wb[1] = intval($v[1][1][1]);
                    $wb[2] = intval($v[1][2][1]);
            } elseif (($key == '/DecodeParms') AND ($v[0] == PDF_TYPE_DICTIONARY)) {
                    $decpar = $v[1];
                    foreach ($decpar as $kdc => $vdc) {
                            if (($kdc == '/Columns') AND ($vdc[0] == PDF_TYPE_NUMERIC)) {
                                    $columns = intval($vdc[1]);
                            } elseif (($kdc == '/Predictor') AND ($vdc[0] == PDF_TYPE_NUMERIC)) {
                                    $predictor = intval($vdc[1]);
                            }
                    }
            } elseif ($filltrailer) {
                    switch($key) {
                            case '/Size':
                            case '/Root':
                            case '/Info':
                            case '/ID':
                                    $xref['trailer'][1][$key] = $v;
                                    break;
                            default:
                                    break;
                    }
            }
    }

第503行是:

代码语言:javascript
复制
            } elseif (($key == '/Index') AND ($v[0] == PDF_TYPE_ARRAY AND count($v[1] >= 2))) {

我知道Count正在尝试对非数组值进行计数。我曾尝试使用is_countable();并指定$v=array();,但收效甚微。

这只适用于一些PDF,仔细阅读我可以发现PDF合并并不是万无一失的,失败的情况确实会发生。然而,我想更多地了解代码,以便确定是什么导致了错误;是错误的代码还是糟糕的PDF (导致意外的情况),或者两者都有?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-28 01:06:02

您正在尝试计算一个布尔值,即$v[1] >= 2的结果

我想你可能习惯于编写代码。

代码语言:javascript
复制
AND count($v[1]) >= 2 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68153425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档