foreach发生preg_match() expects parameter 2 to be string, array given

overme2个月前 (10-17)网页设计147

现象描述:我爱自学小编学习在thinkphp中引入phpspreadsheet第三方库,$data是从数据库中获取的数据,通过foreach循环将获取的数据值放置到Excel单元格中,程序运行时出现preg_match() expects parameter 2 to be string, array given报错。

$data = Inform::where([
                ‘status’ =>-1
            ])
             ->order(‘id’,’desc’)
             ->select();

foreach ($data as $rs) {
            // Add data
            $spreadsheet->getActiveSheet()
                ->setCellValue(‘A’.$i, $rs[‘id’])
                ->setCellValue(‘B’.$i, $rs[‘type’])
                ->setCellValue(‘C’.$i, $rs[‘category’])
                ->setCellValue(‘D’.$i, $rs[‘smalltype’])
                ->setCellValue(‘E’.$i, $rs[‘name’])
                ->setCellValue(‘F’.$i, $rs[‘url’])
                ->setCellValue(‘G’.$i, $rs[‘des’]);
            $i++;
}

解决方法:

->了解报警含义

程序学习过程中,遇到报警的情况,应该先了解报警的含义。preg_match() expects parameter 2 to be string, array given  报错意思直白,preg_match期望第二个传入的参数是字符string,实际传入的是数组,因此报错。

->处理方法:

① 通过打断点的方式进行,注释到foreach中所有代码,发现没有报错
     发现->setCellValue(‘C’.$i, $rs[‘category’])这段代码生效时发生报错

② foreach中通过dump输出各个变量,发现确实$rs[‘category’]输出了数组。原因是在thinkphp模型中,对该字段设置了获取器。



③ 通过上面2个步骤,就知道问题了。解决起来就容易了,在输入了数组的地方,通过数组下标,输入字符串。

$i = 2;
        foreach ($data as $rs) {
            // Add data
            $spreadsheet->getActiveSheet()
                ->setCellValue(‘A’.$i, $rs[‘id’])
                ->setCellValue(‘B’.$i, $rs[‘type’])
                ->setCellValue(‘C’.$i, $rs[‘category’][‘text’])
                ->setCellValue(‘D’.$i, $rs[‘smalltype’] ? ‘成功’ : ‘失败’)
                ->setCellValue(‘E’.$i, $rs[‘name’])
                ->setCellValue(‘F’.$i, $rs[‘url’])
                ->setCellValue(‘G’.$i, $rs[‘des’]);
            $i++;
}

** 注意事项:由于excel第一行已经被标题占用了,因此i=2,从第二行开始。

相关文章


		Thinkphp Invalid argument supplied for foreach()

Thinkphp Invalid argument supplied for foreach()

如下图所示:Thinkphp学习过程中,前端浏览测试时,模板页面输出了Invalid argument supplied for foreach()的错误。 该怎么处理呢! 错误提示 Warni...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。