PHP foreach循环数组值变更检测及MySQL导出Excel数组输出调整
1. 如何在PHP的foreach循环中检查数组值的变化?
其实很简单,咱们只要在循环里保存上一次迭代的目标值,每次都和当前值对比就行。举个实际场景,比如你要监控数组里Invoice Date的变化,代码可以这么写:
// 先初始化变量存上一次的日期值 $previousDate = null; foreach ($yourArray as $item) { $currentDate = $item['Invoice Date']; // 用严格相等对比,避免类型转换搞出乌龙 if ($currentDate !== $previousDate) { echo "日期从 {$previousDate} 变成 {$currentDate} 啦!<br>"; // 这里可以放值变化后的逻辑,比如分组统计、输出分隔线之类的 } // 别忘了更新上一次的值,给下一次循环用 $previousDate = $currentDate; }
如果要同时监控多个字段的变化,把$previousDate改成数组就行,比如$previousValues = [],每次循环对比多个键值对。另外提醒下,用!==严格比对更稳妥,比如数字0和字符串'0'就不会被误判成相同。
2. 调整MySQL导出Excel的数组输出格式
看了你给的数组结构,是索引数组套关联数组,每个子数组对应一行订单数据。要调整输出格式的话,核心是统一表头顺序、规范字段格式,这样导出的Excel才规整,不会乱。下面给你具体步骤:
第一步:固定表头顺序
先定义你想要的Excel列顺序,避免因为数据库查询结果的键顺序变化导致列混乱:
// 按你需要的顺序定义表头 $headerOrder = ['Order Number', 'Product', 'Invoice Date', 'Carriage', 'Carriage Tax Code'];
第二步:按表头顺序整理每行数据
遍历原始数组,把每个子数组的内容按表头顺序重新排列,还可以顺便处理空值和格式:
$formattedData = []; // 先把表头加进去 $formattedData[] = $headerOrder; foreach ($originalArray as $item) { $row = []; foreach ($headerOrder as $key) { // 处理空值,避免Excel出现空白单元格报错 $cellValue = isset($item[$key]) ? $item[$key] : ''; // 针对Carriage字段,格式化保留两位小数 if ($key === 'Carriage') { $cellValue = number_format($cellValue, 2); } // 针对Invoice Date,转成Excel能识别的日期格式(避免当成字符串) if ($key === 'Invoice Date') { $dateParts = explode('/', $cellValue); $cellValue = "{$dateParts[2]}-{$dateParts[1]}-{$dateParts[0]}"; // 转成yyyy-mm-dd } $row[] = $cellValue; } $formattedData[] = $row; }
第三步:用整理好的数组导出Excel
不管你用PhpSpreadsheet还是其他Excel库,直接遍历$formattedData逐行写入就行。比如用PhpSpreadsheet的话,大概是这样:
// 假设已经初始化好$spreadsheet和$worksheet对象 $rowNum = 1; foreach ($formattedData as $row) { $colLetter = 'A'; foreach ($row as $value) { $worksheet->setCellValue($colLetter . $rowNum, $value); // 如果是日期列,设置单元格的日期格式 if ($colLetter === 'C') { // 对应Invoice Date的列,根据你的表头顺序调整 $worksheet->getStyle($colLetter . $rowNum) ->getNumberFormat() ->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DDMMYYYY); } $colLetter++; } $rowNum++; }
这样处理后,导出的Excel不仅列顺序固定,数值和日期格式也符合Excel的要求,不会出现Carriage显示成整数、日期无法排序的问题。
内容的提问来源于stack exchange,提问作者LinusIT
相关产品推荐
相关产品推荐

