将PHP Spreadsheet生成的多维数组转为以首行作为键的关联数组
PHP Spreadsheet:将工作表数组转换为首行作为键的关联数组
你的代码存在几个核心问题:
- 内层循环每次都会覆盖
$ups[$i],导致最终每个元素仅保留最后一列的键值对 - 取值错误使用了固定的
$sheetData_ups[$i][0],应该对应当前列$j的数值 - 首行(表头行)被错误地加入到结果数组中,它应该仅作为键名来源
修正后的实现方案
先提取首行作为键名,再遍历后续行数据,用array_combine快速生成关联数组,同时优化文件扩展名的获取逻辑(避免文件名含多个点的情况):
// 优化扩展名获取逻辑,比explode更可靠 $fileInfo = pathinfo($_FILES['upsfile']['name']); $extension_ups = strtolower($fileInfo['extension']); // 根据扩展名初始化阅读器 switch ($extension_ups) { case 'csv': $reader_ups = new \PhpOffice\PhpSpreadsheet\Reader\Csv(); break; case 'xls': $reader_ups = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); break; default: $reader_ups = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); } $spreadsheet_ups = $reader_ups->load($_FILES['upsfile']['tmp_name']); $sheetData_ups = $spreadsheet_ups->getActiveSheet()->toArray(); // 提取首行作为表头键名 if (empty($sheetData_ups)) { $ups = []; } else { $headers = array_shift($sheetData_ups); $ups = []; // 遍历数据行,生成关联数组 foreach ($sheetData_ups as $row) { // 处理列数不匹配的情况,避免array_combine报错 $row = array_slice($row, 0, count($headers)); $ups[] = array_combine($headers, $row); } } var_dump($ups);
关键说明
array_shift($sheetData_ups):移除并获取数组的第一个元素(表头行),剩余数组即为纯数据行array_combine($headers, $row):将表头数组和当前行数组合并为关联数组,自动对应键值关系- 增加了空数组判断和列数匹配处理,避免因空文件或格式错误导致的报错
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

