PHP中将索引型多维数组转换为以首元素为键的关联数组
解决方案:将PHPSpreadsheet读取的索引数组转为关联数组并存入MySQL
我来帮你搞定这个问题,其实转换逻辑很清晰,咱们分两步走:先把读取到的索引数组转成你想要的关联数组格式,再安全地存入MySQL数据库。
一、修改PHPSpreadsheet读取逻辑,直接生成目标关联数组
你的原代码是把每行都存成索引数组,我们可以调整一下,先提取第一行作为字段名,之后的每一行都对应生成关联数组,这样不用额外再做一次转换,效率更高:
<?php $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName); $worksheet = $spreadsheet->getActiveSheet(); $rows = []; $headers = []; foreach ($worksheet->getRowIterator() as $index => $row) { $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(FALSE); $cells = []; foreach ($cellIterator as $cell) { $cells[] = $cell->getValue(); } // 第一行作为表头(键名),PHPSpreadsheet的行索引从1开始 if ($index === 1) { $headers = $cells; continue; } // 将后续行的索引数组转为关联数组 $assocRow = []; foreach ($headers as $keyIndex => $header) { // 确保对应位置有值,避免索引越界 $assocRow[$header] = isset($cells[$keyIndex]) ? $cells[$keyIndex] : null; } $rows[] = $assocRow; } // 测试输出目标数组 echo '<pre>'; print_r($rows); echo '</pre>'; ?>
这段代码的核心逻辑:
- 用
$index === 1捕获第一行数据,存为关联数组的键名集合$headers - 遍历后续每一行时,将单元格值与对应表头配对,直接生成符合要求的关联数组
二、将关联数组安全存入MySQL数据库
接下来用PDO实现数据入库,一定要用预处理语句避免SQL注入,示例代码如下:
<?php // 数据库连接信息 $dbHost = '你的数据库地址'; $dbName = '你的数据库名'; $dbUser = '用户名'; $dbPass = '密码'; try { // 初始化PDO连接,设置字符集为utf8mb4支持全字符 $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 假设你的目标表名为flight_data,字段与表头完全对应 $tableName = 'flight_data'; // 动态生成SQL语句,适配表头字段 $fields = implode(', ', array_keys($rows[0])); $placeholders = ':' . implode(', :', array_keys($rows[0])); $sql = "INSERT INTO $tableName ($fields) VALUES ($placeholders)"; // 预处理SQL语句 $stmt = $pdo->prepare($sql); // 遍历关联数组,批量插入数据 foreach ($rows as $row) { foreach ($row as $key => $value) { $stmt->bindValue(":$key", $value); } $stmt->execute(); } echo "数据入库成功,共插入" . count($rows) . "条记录"; } catch(PDOException $e) { die("数据库操作失败: " . $e->getMessage()); } ?>
注意事项:
- 确保MySQL表的字段名与表头
$headers完全匹配(比如fsn、ac_type等) - 如果表头包含特殊字符或MySQL关键字,记得用反引号
`包裹字段名 - 若数据量较大,可以考虑用事务批量提交,提升入库效率
内容的提问来源于stack exchange,提问作者Joshua Lutz
相关产品推荐
相关产品推荐

