foreach发生preg_match() expects parameter 2 to be string, array given
现象描述:我爱自学小编学习在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,从第二行开始。